18 Commits
v1.4 ... v2.2

Author SHA1 Message Date
Profitroll
461729fa9e Обновление 2.1 2021-04-30 03:30:20 +03:00
34fe5f0063 Обновление 2.1 2021-04-30 03:28:26 +03:00
6df060142a Обновление 2.1 2021-04-30 03:25:36 +03:00
2183db0515 Обновление 2.0 2021-04-24 03:08:43 +03:00
Profitroll
310faaf79b Мелкие изменения
Добавлен центр поддержки.
2021-04-23 02:39:12 +03:00
5206b3e2fa Обновление 1.8 2021-04-07 23:57:02 +03:00
7598e594da Фикс номера версии 2021-04-06 01:53:48 +03:00
747e666cf1 Обновление 1.7
Фиксы багов связанных с RPC и файлами.
2021-04-06 01:32:55 +03:00
c8e3f64762 Фикс версии 2021-01-22 15:03:17 +02:00
84d47b131c Обновление 1.6
• Исправлены баги с подгрузкой конфига;
• Добавлена возможность выбора пути через Настройки;
• В демоне больше не нужно выбирать OBS если ранее было выбрано "Нет".
2021-01-22 14:53:33 +02:00
eb33215856 Обновлён до 1.5 2021-01-21 14:01:44 +02:00
243e06ee0b Обновление 1.5
• Добавлен Discord RPC;
• Вывод может быть цаетным (опционально);
• Звуковые эффекты теперь можно выключить;
• Пункты меню "Помощь" и "Настройки" сильно изменены.
2021-01-21 14:00:58 +02:00
2b50827e58 Последний фикс README на сегодня :) 2021-01-16 00:22:22 +02:00
79901de58c Ещё один фикс README 2021-01-16 00:21:26 +02:00
5354e0e487 Update README.md 2021-01-16 00:19:23 +02:00
f0b5985aaa Фикс заголовков 2021-01-16 00:13:28 +02:00
bd722212b5 Мелкий фикс MD 2021-01-16 00:10:19 +02:00
3f679531f7 TXT файл был заменён на MD 2021-01-16 00:09:14 +02:00
17 changed files with 2999 additions and 1005 deletions

View File

@@ -1,20 +1,21 @@
Добро пожаловать в AutoZoom! ## Добро пожаловать в AutoZoom!
Contact me [directly](https://t.me/profitroll) or via [Support Center](https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3) if you need English translation.
В этом файле описаны все шаги которые нужно выполнить для работы с программой. В этом файле описаны все шаги которые нужно выполнить для работы с программой.
Содержание ### Содержание
1. Описание и информация 1. [Описание и информация](https://github.com/profitrollgame/autozoom#1-%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8-%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B)
2. Инструкция по установке 2. [Инструкция по установке](https://github.com/profitrollgame/autozoom#21-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5)
3. Инструкция по использованию 3. [Инструкция по использованию](https://github.com/profitrollgame/autozoom#3-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E)
4. Благодарности и помощь 4. [Благодарности и помощь](https://github.com/profitrollgame/autozoom#4-%D0%B7%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%B0)
GitHub вики проекта: https://github.com/profitrollgame/autozoom/wiki ### Полезные ссылки
Обратная связь и предложения: https://t.me/profitroll * [GitHub вики проекта](https://github.com/profitrollgame/autozoom/wiki)
Сообщить об ошибке/баге: https://github.com/profitrollgame/autozoom/issues * [Обратная связь и предложения](https://t.me/profitroll)
* [Сообщить об ошибке/баге](https://github.com/profitrollgame/autozoom/issues)
* [Центр поддержки](https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3)
-----------------------= №1 =----------------------- ### 1. Информация и описание программы
--------- Информация и описание программы ----------
----------------------------------------------------
AutoZoom создан для автоматизации присоединения к AutoZoom создан для автоматизации присоединения к
всевозможным Zoom конференциями. С помощью этой утилиты всевозможным Zoom конференциями. С помощью этой утилиты
@@ -30,30 +31,23 @@ AutoZoom создан для автоматизации присоединени
для удобства, интереса ради или даже в шутку. для удобства, интереса ради или даже в шутку.
----------------------= №2.1 =---------------------- ### 2.1. Инструкция по установке
------------- Инструкция по установке --------------
----------------------------------------------------
1. Переложите папку 1. Пришло время найти место для нашей программы. Скопируйте папку из этого
Пришло время найти место для нашей программы. Скопируйте папку из этого
архива в любое удобное место на компьютере (если ещё этого не сделали). архива в любое удобное место на компьютере (если ещё этого не сделали).
2. Установите Python3 2. Попробуйте запустить ваш `start.bat` в папке `AutoZoom`. Возможно, он сам отправит вас на страницу загрузки Python.
Попробуйте запустить ваш 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).
3. Откройте редактор 3. Дважды нажмите на `start.bat` и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой
Дважды нажмите на start.bat и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой
удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение. удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение.
4. Настройте вход в Zoom 4. Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК.
Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК.
Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО
нужно нажать на галочку о сохранении аккаунта "Не выполнять выход". нужно нажать на галочку о сохранении аккаунта "Не выполнять выход".
5. Настройки клиента Zoom 5. Нажмите на шестерёнку под вашим аватаром (правый верхний угол) и зайдите
Нажмите на шестерёнку под вашим аватаром (правый верхний угол) и зайдите
в пункт "Видеоизображение". В этом пункте найдите галочку "Выключать мое видео в пункт "Видеоизображение". В этом пункте найдите галочку "Выключать мое видео
при входе в конференцию" и активируйте её. Затем уберите галочку с "Всегда показывать диалоговое при входе в конференцию" и активируйте её. Затем уберите галочку с "Всегда показывать диалоговое
окно предварительного просмотра видео при подключении к видеоконференции". Замечательно, окно предварительного просмотра видео при подключении к видеоконференции". Замечательно,
@@ -61,27 +55,24 @@ Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?active
подключать звук с компьютера" и "Отключить звук моего микрофона при подключении к конференции". Также подключать звук с компьютера" и "Отключить звук моего микрофона при подключении к конференции". Также
можно убрать галочку с "Нажмите и удерживайте клавишу пробел, чтобы временно включить свой звук", если нужно. можно убрать галочку с "Нажмите и удерживайте клавишу пробел, чтобы временно включить свой звук", если нужно.
Почти закончили. Теперь перейдите в пункт "Сочетания клавиш" и выключите всё вам не нужное дабы случайно Почти закончили. Теперь перейдите в пункт "Сочетания клавиш" и выключите всё вам не нужное дабы случайно
не помешать процессу автоматизации. Некоторые сочетания нужно удалить. Например, Alt+A лучше удалить нажав не помешать процессу автоматизации. Некоторые сочетания нужно удалить. Например, `Alt+A` лучше удалить нажав
сначала на неё, а потом на Backspace. Желательно убрать все ненужные сочетания сразу. сначала на неё, а потом на Backspace. Желательно убрать все ненужные сочетания сразу.
6. Готово 6. Вроде как всё настроено, пришло время открыть в папке приложения файл `start.bat` двойным нажатием и всё готово.
Вроде как всё настроено, пришло время открыть в папке приложения файл start.bat двойным нажатием и всё готово.
После вопроса про OBS можно перейти к опциональным шагам ниже для записи конференций или же просто нажать После вопроса про OBS можно перейти к опциональным шагам ниже для записи конференций или же просто нажать
"Н" на клавиатуре и перейти сразу к делу. "Н" на клавиатуре и перейти сразу к делу.
----------------------= №2.2 =---------------------- ### 2.2. Запись конференций
(Опционально) Запись конференций С [официального сайта](https://obsproject.com/download) скачайте и установите OBS Studio для записи всех конференций.
С официального сайта (https://obsproject.com/download) скачайте и установите OBS Studio для записи всех конференций.
После стандартного процесса установки откройте только что установленный OBS. В вопросах мастера настойки укажите, После стандартного процесса установки откройте только что установленный OBS. В вопросах мастера настойки укажите,
что вас интересует запись. Разрешение укажите нужное вам. что вас интересует запись. Разрешение укажите нужное вам.
Пройдя всё банальное и объяснённое в установщике отправляемся в настройки. Сразу же находим пункт "Вывод" в боковой Пройдя всё банальное и объяснённое в установщике отправляемся в настройки. Сразу же находим пункт "Вывод" в боковой
панели и меняем формат записи на mp4, если нужно будет потом редактировать видео. Если же нет не трогаем. панели и меняем формат записи на `mp4`, если нужно будет потом редактировать видео. Если же нет не трогаем.
Потом двигаемся к пункту "Горячие клавиши" и находим "Начать запись" и "Остановить запись". Тыкаем на поле мышкой, а Потом двигаемся к пункту "Горячие клавиши" и находим "Начать запись" и "Остановить запись". Тыкаем на поле мышкой, а
затем прожимаем необходимую комбинацию клавиш. Рекомендую устанавливать на старт "Shift+F7", а на остановку "Shift+F8", затем прожимаем необходимую комбинацию клавиш. Рекомендую устанавливать на старт `Shift+F7`, а на остановку `Shift+F8`,
однако можете поставить всё что вам удобно. однако можете поставить всё что вам удобно.
Чтобы наша запись работала правильно необходимо открыть в боковой панели "Общие" и в подразделе "Системный трей" поставить Чтобы наша запись работала правильно необходимо открыть в боковой панели "Общие" и в подразделе "Системный трей" поставить
@@ -99,61 +90,57 @@ Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?active
Если нужно ещё и записать ваш голос с микрофона снова жмём + добавляя устройство ВХОДНОГО аудиопотока, Если нужно ещё и записать ваш голос с микрофона снова жмём + добавляя устройство ВХОДНОГО аудиопотока,
выбираем нужный микрофон и дальше снова "ОК". Замечательно, в OBS всё настроено. Двигаем в AutoZoom. выбираем нужный микрофон и дальше снова "ОК". Замечательно, в OBS всё настроено. Двигаем в AutoZoom.
В случае если вы ставили свои комбинации клавиш (вместо рекомендуемых), то сейчас нужно открыть run.bat в папке В случае если вы ставили свои комбинации клавиш (вместо рекомендуемых), то сейчас нужно открыть `start.bat` в папке
AutoZoom и выбрать пункт "Настройки". Затем выберите пункт "Начать запись" и введите желаемую комбинацию AutoZoom и выбрать пункт "Настройки". Затем выберите пункт "Начать запись" и введите желаемую комбинацию
клавиш (например, Shift+F7), нажмите Enter. Теперь выберите пункт "Остановить запись" и снова введите комбинацию клавиш. клавиш (например, `Shift+F7`), нажмите `Enter`. Теперь выберите пункт "Остановить запись" и снова введите комбинацию клавиш.
Желательно, чтобы комбинации были разными, дабы точно избежать сбоев, однако это не по принципиально. Чудесно, жмакаем Желательно, чтобы комбинации были разными, дабы точно избежать сбоев, однако это не по принципиально. Чудесно, жмакаем
последний пункт здесь и в меню редактора. Движемся дальше к run.bat. последний пункт здесь и в меню редактора. Движемся дальше к run.bat.
Открывая AutoZoom можно обнаружить, что он спрашивает хотим ли мы использовать OBS. Пишем Y или Д и жмём Enter. Открывая AutoZoom можно обнаружить, что он спрашивает хотим ли мы использовать OBS. Пишем `Y` или `Д` и жмём `Enter`.
В появившемся окне выбираем .exe файл нашего OBS. Обычно он лежит в "C:/Program Files/obs-studio/bin/64bit/obs64.exe", В появившемся окне выбираем .exe файл нашего OBS. Обычно он лежит в `C:/Program Files/obs-studio/bin/64bit/obs64.exe`,
но у вас может быть вместо 64bit папка 32bit, а файл obs32.exe. В случае с выбранным вами другим путём при но у вас может быть вместо `64bit` папка `32bit`, а файл `obs32.exe`. В случае с выбранным вами другим путём при
установке ищите файл там, куда кинули. установке ищите файл там, куда кинули.
После выбора `.exe` файла вам должно в консоль AutoZoom написать пути ядра и приложения OBS.
Они также будут храниться в файлах AutoZoom, если вдруг понадобится их изменить.
----------------------= №2.3 =----------------------
(Опционально) Telegram бот
### 2.3. Telegram бот
Если же вам нужно получать уведомления от бота через Telegram - такая опция тоже есть. Если же вам нужно получать уведомления от бота через Telegram - такая опция тоже есть.
Для этого нужно создать бота через BotFather (@BotFather) командой /newbot. Для этого нужно создать бота через BotFather ([@BotFather](https://t.me/botfather)) командой `/newbot`.
Затем вводим имя нашему боту, по сути любое которое нужно. Затем id бота чтобы оно заканчивалось на "bot" или "_bot". Затем вводим имя нашему боту, по сути любое которое нужно. Затем id бота чтобы оно заканчивалось на `bot` или `_bot`.
После этого мы получаем HTTP API (токен бота) который вводим во время запуска AutoZoom или же перейдя в пункт После этого мы получаем HTTP API (токен бота) который вводим во время запуска AutoZoom или же перейдя в пункт
настроек. После ввода туда токена нужно написать нашему только что созданному боту через его имя (то, что на "bot" кончается) настроек. После ввода туда токена нужно написать нашему только что созданному боту через его имя (то, что на "bot" кончается)
номер который выдаст AutoZoom. номер который выдаст AutoZoom.
По желанию можно введя команду /setuserpic и выбрав вашего бота ещё и сменить его аватар. По желанию можно введя команду `/setuserpic` и выбрав вашего бота ещё и сменить его аватар.
Теперь каждый раз когда AutoZoom будет начинать работу или заходить/покидать конференцию вы сразу же получите Теперь каждый раз когда AutoZoom будет начинать работу или заходить/покидать конференцию вы сразу же получите
сообщение в вашу личку Telegram. сообщение в вашу личку Telegram.
-----------------------= №3 =----------------------- ### 3. Инструкция по использованию
------------ Инструкция по использованию -----------
----------------------------------------------------
У нас есть рабочая и настроенная программа, но как же этим чудом теперь пользоваться? Всё очень просто. У нас есть рабочая и настроенная программа, но как же этим чудом теперь пользоваться? Всё очень просто.
Для начала открываем наш start.bat и тыкаем в пункт "Редактор". Там жмём "Добавить урок" и следуем шагам в приложении. Для начала открываем наш `start.bat` и тыкаем в пункт "Редактор". Там жмём "Добавить урок" и следуем шагам в приложении.
Чтобы удалить конференцию в меню редактора можно нажать "Удалить урок" и выбрать индекс (число слева посередине каждого урока). Чтобы удалить конференцию в меню редактора можно нажать "Удалить урок" и выбрать индекс (число слева посередине каждого урока).
Также, если вдруг что-то перенеслось, можно изменить конференции. нажав в редакторе "Изменить урок". Также, если вдруг что-то перенеслось, можно изменить конференции. нажав в редакторе "Изменить урок".
Если нужно записать программу в автозапуск - сделать это легко. Если нужно записать программу в автозапуск - сделать это легко.
Для этого создайте ярлык для daemon.bat или start.bat, вырежьте его и вставьте по пути автозапуска Для этого создайте ярлык для `daemon.bat` или `start.bat`, вырежьте его и вставьте по пути автозапуска
(обычно это "C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"). (обычно это `C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`).
Готово! Теперь при запуске компьютера через некоторое время после входа в пользователя у вас запустится AutoZoom сам. Это Готово! Теперь при запуске компьютера через некоторое время после входа в пользователя у вас запустится AutoZoom сам. Это
может быть полезно если хочется полностью автоматизировать присоединение к конференциям. может быть полезно если хочется полностью автоматизировать присоединение к конференциям.
Также если что-то пошло не так - можно в меню настроек сбросить все параметры до "По умолчанию". Также если что-то пошло не так - можно в меню настроек сбросить все параметры до "По умолчанию".
-----------------------= №4 =----------------------- ### 4. Заключительные слова
--------------- Заключительные слова ---------------
----------------------------------------------------
На этом полная установка подходит к концу. На этом полная установка подходит к концу.
Если же вы нашли ошибки не стесняйтесь писать в Telegram мне прямо в личку (https://t.me/profitroll). Если же вы нашли ошибки оставляйте свои репорты на [GitHub](https://github.com/profitrollgame/autozoom/issues) или пишите мне в [Telegram](https://t.me/profitroll).
Приятного использования! Приятного использования!
P.S.: Отдельное спасибо Kusyaka за помощь в создании сего творения. P.S.: Отдельное спасибо Kusyaka за помощь в создании сего творения.
Без тебя, если честно, у меня бы ничего не вышло, дружище <3 Без тебя, если честно, у меня бы ничего не вышло, дружище <3

24
colors.py Normal file
View File

@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
RESET = '\u001b[0m'
BLACK = '\u001b[30m'
RED = '\u001b[31m'
GREEN = '\u001b[32m'
YELLOW = '\u001b[33m'
BLUE = '\u001b[34m'
MAGENTA = '\u001b[35m'
CYAN = '\u001b[36m'
WHITE = '\u001b[37m'
BBLACK = '\u001b[30;1m'
BRED = '\u001b[31;1m'
BGREEN = '\u001b[32;1m'
BYELLOW = '\u001b[33;1m'
BBLUE = '\u001b[34;1m'
BMAGENTA = '\u001b[35;1m'
BCYAN = '\u001b[36;1m'
BWHITE = '\u001b[37;1m'
ULINE = '\u001b[4m'
REVERSE = '\u001b[7m'

1422
daemon.py

File diff suppressed because it is too large Load Diff

4
daemon.sh Normal file
View File

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

642
editor.py Normal file
View File

@@ -0,0 +1,642 @@
import rpc
from functions import *
from datetime import datetime, date, timedelta
from daemon import getLessons, getConfig
if getConfig("use_colors"):
from colors import *
appendLog('Colors imported')
else:
RESET = ''
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
ULINE = REVERSE = ''
appendLog('Loading without colors')
def listLessons(from_where='remove'):
try:
appendLog('Showing list of everything planned')
if from_where == 'editor':
print(f'{RESET}Полный список запланированных конференций:\n')
print(f'{BBLACK}================================================{RESET}')
for les in enumerate(getLessons()):
if les[1]["repeat"]:
repeat = 'Вкл.'
else:
repeat = 'Выкл.'
if les[1]["record"]:
record = 'Вкл.'
else:
record = 'Выкл.'
try:
repeat_day = getDay(les[1]["repeat_day"])
except:
repeat_day = 'Не повторяется'
length = len(str(les[0]))
spacer_all = 6 * ' '
spacer_ind = (5 - length) * ' '
print(f'{spacer_all}Имя: {YELLOW}{les[1]["name"]}{RESET}')
print(f'{spacer_all}Дата: {YELLOW}{les[1]["date"]}{RESET}')
print(f'{spacer_all}Время: {YELLOW}{les[1]["time"]}{RESET}')
print(f' {GREEN}{les[0]}{RESET}{spacer_ind}Ссылка: {YELLOW}{les[1]["link"]}{RESET}')
print(f'{spacer_all}Повтор: {YELLOW}{repeat}{RESET}')
print(f'{spacer_all}День: {YELLOW}{repeat_day}{RESET}')
print(f'{spacer_all}Запись: {YELLOW}{record}{RESET}')
print(f'{BBLACK}================================================{RESET}')
if from_where == 'editor':
none = input('\n\n > ')
except KeyboardInterrupt:
clear()
return
def sortLessons(dictionary):
dictionary.sort(key = lambda x: datetime.strptime(x['time'], '%H:%M'))
dictionary.sort(key = lambda x: datetime.strptime(x['date'], '%d.%m.%Y'))
appendLog('Lessons dictionary sorted')
def getDay(number):
if number == 1:
return 'Понедельник'
if number == 2:
return 'Вторник'
if number == 3:
return 'Среда'
if number == 4:
return 'Четверг'
if number == 5:
return 'Пятница'
if number == 6:
return 'Суббота'
if number == 7:
return 'Воскресенье'
def addLesson():
appendLog('Adding new lesson')
try:
local_lessons = {}
lessons_got = getLessons()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\n > {CYAN}')
local_lessons.update({"name": lessname})
while True:
clear()
today = date.today()
today_1 = date.today() + timedelta(days=1)
today_2 = date.today() + timedelta(days=2)
today_3 = date.today() + timedelta(days=3)
today_4 = date.today() + timedelta(days=4)
today_5 = date.today() + timedelta(days=5)
today_6 = date.today() + timedelta(days=6)
print(f'{RESET}Введите дату конференции или номер дня ({BRED}ДД.ММ.ГГГГ{RESET}):\n')
print(f' {BRED}1.{RESET} {today.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}2.{RESET} {today_1.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_1.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}3.{RESET} {today_2.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_2.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}4.{RESET} {today_3.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_3.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}5.{RESET} {today_4.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_4.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}6.{RESET} {today_5.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_5.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}7.{RESET} {today_6.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_6.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
try:
lessdate = input(f'\n > {BRED}')
if lessdate == '':
finallessdate = lessons_got[edi]["date"]
elif lessdate == '1':
finallessdate = today.strftime("%d.%m.%Y")
elif lessdate == '2':
finallessdate = today_1.strftime("%d.%m.%Y")
elif lessdate == '3':
finallessdate = today_2.strftime("%d.%m.%Y")
elif lessdate == '4':
finallessdate = today_3.strftime("%d.%m.%Y")
elif lessdate == '5':
finallessdate = today_4.strftime("%d.%m.%Y")
elif lessdate == '6':
finallessdate = today_5.strftime("%d.%m.%Y")
elif lessdate == '7':
finallessdate = today_6.strftime("%d.%m.%Y")
else:
try:
test = (datetime.strptime(lessdate, "%d.%m.%Y"))
finallessdate = lessdate
except:
continue
local_lessons.update({"date": finallessdate})
break
except:
continue
while True:
clear()
try:
lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\n > {BRED}')
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
local_lessons.update({"time": lesstime})
abort = "skip"
conflict = False
conflictles = ''
confstr = 'конференцией'
try:
for lesson in lessons_got:
if lesson["date"] == finallessdate and lesson["time"] == lesstime:
conflict = True
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
break
except:
continue
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(" ", "")
if lesslink.replace(' ', '') == '1':
clear()
lessid = input(f'{RESET}Введите идентификатор конференции:\n{BBLACK}Формат: {BRED}012 3456 7890 {BBLACK} либо {BRED}01234567890{RESET}\n\n > {BRED}')
clear()
lesspasswd = input(f'{RESET}Введите код доступа (пароль) конференции:\n\n > {BRED}')
lesslink = f'https://us01web.zoom.us/j/{lessid.replace(" ", "")}?pwd={lesspasswd.replace(" ", "")}'
local_lessons.update({"link": lesslink})
while True:
clear()
repeat = input(f'{RESET}Повторять эту конференцию ({getDay(getDayNum(finallessdate))})? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if repeat.lower() in yes_list:
finalrepeat = True
finalrepeatday = getDayNum(finallessdate)
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
elif repeat.lower() in no_list:
finalrepeat = False
finalrepeatday = None
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
else:
continue
while True:
if getOS() == "windows":
clear()
lessrecord = input(f'Записать эту конференцию? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n > ')
if lessrecord.lower() in yes_list:
finallessrecord = True
local_lessons.update({"record": finallessrecord})
break
elif lessrecord.lower() in no_list:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
else:
continue
else:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
lessons_got.append(dict(local_lessons))
sortLessons(lessons_got)
saveJson(files_folder+'lessons.json', lessons_got)
clear()
print(f'Добавлена конференция {CYAN}{local_lessons["name"]}{RESET} за {BRED}{local_lessons["date"]}{RESET} на время {BRED}{local_lessons["time"]}{RESET}.')
appendLog(f'Added lesson {local_lessons["name"]} (Date: {local_lessons["date"]}, Time: {local_lessons["time"]}, Link: {local_lessons["link"]})')
none = input('\n > ')
except KeyboardInterrupt:
appendLog('Lesson adding aborted')
clear()
return
def editLesson():
appendLog(f'Editing existing lesson')
try:
local_lessons = {}
lessons_got = getLessons()
while True:
print(f'{RESET}Выберите номер (индекс) для изменения:\n')
listLessons()
lessons_got = getLessons()
print(f'\nДля отмены операции введите {BRED}c{RESET} или {BRED}cancel{RESET}')
edi = input(f'\n > {BGREEN}')
if not isinstance(edi, int):
if edi.lower() == 'c' or edi.lower() == 'cancel':
clear()
return
try:
edi = int(edi)
except:
clear()
continue
try:
probe = lessons_got[edi]["name"]
break
except:
clear()
print(f'{RESET}Выберите {ULINE}правильный{RESET} индекс (номер) для изменения.')
time.sleep(3)
clear()
continue
break
clear()
lessname = input(f'{RESET}Введите (своё) имя конференции:\n{BBLACK}Нужно лишь для отображения в Discord и самом AutoZoom{RESET}\n\nОригинальное имя: {CYAN}{lessons_got[edi]["name"]}{RESET}\n\n > {CYAN}')
if lessname == '':
lessname = lessons_got[edi]["name"]
local_lessons.update({"name": lessname})
while True:
clear()
today = date.today()
today_1 = date.today() + timedelta(days=1)
today_2 = date.today() + timedelta(days=2)
today_3 = date.today() + timedelta(days=3)
today_4 = date.today() + timedelta(days=4)
today_5 = date.today() + timedelta(days=5)
today_6 = date.today() + timedelta(days=6)
print(f'{RESET}Введите дату конференции или номер дня ({BRED}ДД.ММ.ГГГГ{RESET}):\n')
print(f' {BRED}1.{RESET} {today.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}2.{RESET} {today_1.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_1.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}3.{RESET} {today_2.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_2.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}4.{RESET} {today_3.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_3.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}5.{RESET} {today_4.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_4.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}6.{RESET} {today_5.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_5.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f' {BRED}7.{RESET} {today_6.strftime("%d.%m.%Y")} ({BGREEN}{getDay(datetime.strptime(today_6.strftime("%d.%m.%Y"), "%d.%m.%Y").isoweekday())}{RESET})')
print(f'\nОригинальная дата: {BRED}{lessons_got[edi]["date"]}{RESET}')
try:
lessdate = input(f'\n > {BRED}')
if lessdate == '':
finallessdate = lessons_got[edi]["date"]
elif lessdate == '1':
finallessdate = today.strftime("%d.%m.%Y")
elif lessdate == '2':
finallessdate = today_1.strftime("%d.%m.%Y")
elif lessdate == '3':
finallessdate = today_2.strftime("%d.%m.%Y")
elif lessdate == '4':
finallessdate = today_3.strftime("%d.%m.%Y")
elif lessdate == '5':
finallessdate = today_4.strftime("%d.%m.%Y")
elif lessdate == '6':
finallessdate = today_5.strftime("%d.%m.%Y")
elif lessdate == '7':
finallessdate = today_6.strftime("%d.%m.%Y")
else:
try:
test = (datetime.strptime(lessdate, "%d.%m.%Y"))
finallessdate = lessdate
except:
continue
local_lessons.update({"date": finallessdate})
break
except:
continue
while True:
clear()
try:
lesstime = input(f'{RESET}Введите время конференции ({BRED}ЧЧ:ММ{RESET}):\n\nОригинальное время: {BRED}{lessons_got[edi]["time"]}{RESET}\n\n > {BRED}')
finallesstime = (datetime.strptime(lesstime, "%H:%M"))
local_lessons.update({"time": lesstime})
abort = "skip"
conflict = False
conflictles = ''
confstr = 'конференцией'
try:
for lesson in lessons_got:
if lesson["date"] == finallessdate and lesson["time"] == lesstime:
conflict = True
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
break
except:
continue
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(" ", "")
if lesslink.replace(' ', '') == '1':
clear()
lessid = input(f'{RESET}Введите идентификатор конференции:\n{BBLACK}Формат: {BRED}012 3456 7890 {BBLACK} либо {BRED}01234567890{RESET}\n\n > {BRED}')
clear()
lesspasswd = input(f'{RESET}Введите код доступа (пароль) конференции:\n\n > {BRED}')
lesslink = f'https://us01web.zoom.us/j/{lessid.replace(" ", "")}?pwd={lesspasswd.replace(" ", "")}'
if lesslink == '':
lesslink = lessons_got[edi]["link"]
local_lessons.update({"link": lesslink})
while True:
clear()
try:
lessrepeatday = getDay(lessons_got[edi]["repeat_day"])
except:
lessrepeatday = 'Не повторяется'
print(f'{RESET}Повторять эту конференцию ({YELLOW}{getDay(getDayNum(finallessdate))}{RESET})? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})')
print(f'\nОригинальное значение: {BRED}{lessrepeatday}{RESET}')
repeat = input('\n > ')
if repeat.lower() in yes_list:
finalrepeat = True
finalrepeatday = getDayNum(finallessdate)
local_lessons.update({"repeat": finalrepeat})
local_lessons.update({"repeat_day": finalrepeatday})
break
elif repeat.lower() in no_list:
finalrepeat = False
local_lessons.update({"repeat": finalrepeat})
break
elif repeat == '':
finalrepeat = lessons_got[edi]["repeat"]
local_lessons.update({"repeat": finalrepeat})
try:
finalrepeatday = lessons_got[edi]["repeat_day"]
local_lessons.update({"repeat_day": finalrepeatday})
except:
pass
break
else:
continue
while True:
if getOS() == "windows":
clear()
print(f'Записать эту конференцию? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})')
print(f'\nОригинальное значение: {BRED}{lessons_got[edi]["record"]}{RESET}')
lessrecord = input('\n > ')
if lessrecord.lower() in yes_list:
finallessrecord = True
local_lessons.update({"record": finallessrecord})
break
elif lessrecord.lower() in no_list:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
elif lessrecord == '':
finallessrecord = lessons_got[edi]["record"]
local_lessons.update({"record": finallessrecord})
break
else:
continue
else:
finallessrecord = False
local_lessons.update({"record": finallessrecord})
break
del lessons_got[edi]
lessons_got.append(dict(local_lessons))
sortLessons(lessons_got)
saveJson(files_folder+'lessons.json', lessons_got)
clear()
print(f'Изменена конференция {CYAN}{lessname}{RESET} за {BRED}{finallessdate}{RESET} на время {BRED}{finallesstime}{RESET}.')
appendLog(f'Edited lesson {lessname} (Date: {finallessdate}, Time: {finallesstime}, Link: {local_lessons["link"]})')
none = input('\n > ')
except KeyboardInterrupt:
appendLog('Editing existing lesson aborted')
clear()
return
def removeLesson():
appendLog(f'Removing existing lesson')
try:
while True:
print(f'{RESET}Выберите номер (индекс) для удаления:\n')
listLessons()
lessons_local = getLessons()
print(f'\n{BBLACK}Для отмены операции введите {BRED}c{BBLACK} или {BRED}cancel{RESET}')
rem = input(f'\n > {BRED}')
if rem.lower() == 'c' or rem.lower() == 'cancel':
clear()
break
else:
try:
rem = int(rem)
except:
clear()
continue
try:
del_name = lessons_local[rem]["name"]
del_date = lessons_local[rem]["date"]
del_time = lessons_local[rem]["time"]
del lessons_local[rem]
except:
clear()
print(f'{RESET}Выберите {ULINE}правильный{RESET} индекс (номер) для удаления.')
time.sleep(3)
clear()
continue
sortLessons(lessons_local)
saveJson(files_folder+'lessons.json', lessons_local)
clear()
print(f'{RESET}Удалена конференция {CYAN}{del_name}{RESET} за {BRED}{del_date}{RESET} на время {BRED}{del_time}{RESET}.')
appendLog(f'Removed lesson {del_name} (Date: {del_date}, Time: {del_time})')
none = input('\n > ')
break
except KeyboardInterrupt:
appendLog('Lesson removal aborted')
clear()
return
def removeAllLessons():
appendLog('Removing all lessons')
try:
while True:
clear()
removeall = input(f'{RESET}Вы уверены что хотите удалить все конференции? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n{BRED}Внимание!{RESET} Это действие нельзя обратить!\nВаши настройки затронуты НЕ будут.\n\n > ')
if removeall.lower() in yes_list:
with open(files_folder+'lessons.json', 'w', encoding="utf-8") as f:
f.write("[]")
f.close()
appendLog('All lessons removed')
clear()
none = input('Все конференции были удалены.\n\n > ')
clear()
break
elif removeall.lower() in no_list:
appendLog('All lessons removal aborted')
clear()
break
else:
continue
except KeyboardInterrupt:
appendLog('All lessons removal aborted')
clear()
return
def editor():
try:
setTitle("AutoZoom (Редактор)", getOS())
appendLog('Editor menu opened')
from main import mainMenu
while True:
clear()
print(f'{BBLACK}»{RESET} Меню редактора\n')
print(f' {BRED}1.{RESET} Добавить конференцию')
print(f' {BRED}2.{RESET} Изменить конференцию')
print(f' {BRED}3.{RESET} Удалить конференцию')
print(f' {BRED}4.{RESET} Посмотреть конференции')
print(f' {BRED}5.{RESET} Удалить все конференции')
print(f' {BRED}6.{RESET} В главное меню')
editor_choose = input(f'\n > {BRED}')
if editor_choose == '1':
appendLog('Went to lesson adding')
clear()
addLesson()
elif editor_choose == '2':
appendLog('Went to lesson editing')
clear()
editLesson()
elif editor_choose == '3':
appendLog('Went to lesson removal')
clear()
removeLesson()
elif editor_choose == '4':
appendLog('Went to lesson lising')
clear()
listLessons(from_where = 'editor')
elif editor_choose == '5':
appendLog('Went to all lessons removal')
clear()
removeAllLessons()
elif editor_choose == '6':
appendLog('Exiting back to main menu')
rpc.inMenu()
clear()
setTitle("AutoZoom (Главная)", getOS())
mainMenu()
else:
continue
except KeyboardInterrupt:
appendLog('Exiting back to main menu')
rpc.inMenu()
clear()
return

View File

@@ -1,8 +0,0 @@
{
"debug": false,
"shutdown_timeout": 30,
"shutdown_enabled": true,
"start": "shift+f7",
"stop": "shift+f8",
"telegram_enabled": false
}

402
functions.py Normal file
View File

@@ -0,0 +1,402 @@
# -*- coding: utf-8 -*-
import pip
import time
import json
import os
import shutil
import gzip
import getpass
from datetime import datetime
from pathlib import Path
from subprocess import check_output
path = Path(__file__).resolve().parent
sounds_folder = str(Path(str(path)+"/sounds/")) + os.sep
files_folder = str(Path(str(path)+"/files/")) + os.sep
logs_folder = str(Path(str(path)+"/logs/")) + os.sep
yes_list = ['y', 'yes', 'д', 'да']
no_list = ['n', 'no', 'н', 'нет']
default_config = {
"firstboot": True,
"debug": False,
"shutdown_timeout": 30,
"shutdown_enabled": False,
"start": "shift+f7",
"stop": "shift+f8",
"telegram_enabled": False,
"use_colors": True,
"run_fullscreen": False,
"use_rpc": True,
"sounds": True,
"end_mode": "shutdown",
"obs_exe": None,
"obs_core": None,
"update_check": True,
"write_logs": True,
"log_size": 512
}
# Функция возвращающая надпись Windows Only
def winOnly(color, reset, system, start='', end=''):
if system != 'windows':
return f"{start}{color}Только для Windows!{reset}{end}"
else:
return ""
# Функция возвращающая тип ОС
def getOS():
if os.name == 'nt':
return "windows"
elif 'android' in str(check_output('uname -a', shell=True).lower()):
return "android"
else:
return "unix"
# Функция отвечает за очищение командной строки
if getOS() == "windows":
clear = lambda: os.system('cls')
else:
clear = lambda: os.system('clear')
# Установка заголовка окна cmd.exe
def setTitle(title, system):
if system == "windows":
try:
os.system(f"title {title}")
except:
pass
# Получить номер дня недели
def getDayNum(day):
output = datetime.strptime(day, "%d.%m.%Y").isoweekday()
return output
# Функция проверки размера файла
def checkSize():
global logs_folder
i = 0
while i < 2:
try:
log = os.stat(logs_folder + 'latest.log')
if (log.st_size / 1024) > getConfig("log_size"):
with open(logs_folder + 'latest.log', 'rb') as f_in:
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)
if getConfig("debug"):
print(f'Copied {logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip')
open(logs_folder + 'latest.log', 'w').close()
i = 2
except FileNotFoundError:
if getConfig("debug"):
print('Log file not found')
time.sleep(2)
try:
log = open(logs_folder + 'latest.log', 'a')
open(logs_folder + 'latest.log', 'a').close()
except:
try:
os.mkdir(logs_folder)
log = open(logs_folder + 'latest.log', 'a')
open(logs_folder + 'latest.log', 'a').close()
except:
if getConfig("debug"):
time.sleep(2)
print('Log file could not be created')
i += 1
# Функция добавления в лог
def appendLog(message, startup=False, shutdown=False):
if getConfig("write_logs"):
global logs_folder
checkSize()
try:
log = open(logs_folder + 'latest.log', 'a')
open(logs_folder + 'latest.log', 'a').close()
except:
try:
os.mkdir(logs_folder)
log = open(logs_folder + 'latest.log', 'a')
open(logs_folder + 'latest.log', 'a').close()
except:
time.sleep(2)
print('Log file could not be created')
if startup:
log.write(f'[{datetime.now().strftime("%H:%M:%S | %d.%m.%Y")}] [STARTUP] {message}\n')
elif shutdown:
log.write(f'[{datetime.now().strftime("%H:%M:%S | %d.%m.%Y")}] [SHUTDOWN] {message}\n')
else:
log.write(f'[{datetime.now().strftime("%H:%M:%S | %d.%m.%Y")}] {message}\n')
log.close()
# Функция проигрывания звука
def playSound(soundname, timing=''):
global sysname
if getConfig("sounds"):
if getOS() == "windows":
try:
winsound.PlaySound(sounds_folder+soundname+".wav", winsound.SND_FILENAME)
except Exception as exp:
appendLog(f'Could not play winsound: {exp}')
if getConfig("debug"):
print(f'{timing} Не удалось проиграть winsound звук "{soundname}" (Ошибка: {exp})')
try:
playsound(sounds_folder+soundname+".wav")
except Exception as exp:
appendLog(f'Could not play playsound: {exp}')
if getConfig("debug"):
print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})')
elif getOS() == "android":
try:
os.system(f'play-audio {sounds_folder}{soundname}.wav')
except Exception as exp:
appendLog(f'Could not play play-audio: {exp}')
else:
try:
playsound(sounds_folder+soundname+".wav")
except Exception as exp:
appendLog(f'Could not play playsound: {exp}')
if getConfig("debug"):
print(f'{timing} Не удалось проиграть playsound звук "{soundname}" (Ошибка: {exp})')
# Функция добавления переменных, если их нет
def repairConfig(some_dic):
global files_folder
global default_config
for key in default_config:
try:
some_dic[key]
except KeyError:
some_dic[key] = default_config[key]
saveJson(files_folder+'config.json', some_dic)
# Функция изменения переменной конфигурации
def setConfig(some_var, some_val):
global files_folder
global default_config
if os.path.exists(files_folder):
if not os.path.exists(files_folder+'config.json'):
temp_config_list = default_config
temp_config_list[some_var] = some_val
saveJson(files_folder+'config.json', temp_config_list)
else:
try:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}')
except:
try:
repairConfig(config_list)
config_list = json.load(json_file)
json_file.close()
config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}')
except:
pass
except:
return "Error"
else:
os.mkdir(files_folder)
if not os.path.exists(files_folder+'config.json'):
temp_config_list = default_config
temp_config_list[some_var] = some_val
saveJson(files_folder+'config.json', temp_config_list)
else:
try:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list)
except:
try:
repairConfig(config_list)
config_list = json.load(json_file)
json_file.close()
config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}')
except:
config_list[some_var] = some_val
saveJson(files_folder+'config.json', config_list)
appendLog(f'Changed variable "{somevar}" to {some_val}')
except:
return "Error"
# Функция получения переменной конфигурации
def getConfig(some_var):
global files_folder
global default_config
if os.path.exists(files_folder):
if not os.path.exists(files_folder+'config.json'):
temp_config_list = default_config
saveJson(files_folder+'config.json', temp_config_list)
return temp_config_list[some_var]
else:
try:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
return config_list[some_var]
except:
try:
repairConfig(config_list)
config_list = json.load(json_file)
json_file.close()
return config_list[some_var]
except:
return default_config[some_var]
except:
return "Error"
else:
os.mkdir(files_folder)
if not os.path.exists(files_folder+'config.json'):
temp_config_list = default_config
saveJson(files_folder+'config.json', temp_config_list)
return temp_config_list[some_var]
else:
try:
with open(f"{files_folder}config.json", encoding="utf-8") as json_file:
config_list = json.load(json_file)
json_file.close()
try:
return config_list[some_var]
except:
try:
repairConfig(config_list)
config_list = json.load(json_file)
json_file.close()
return config_list[some_var]
except:
return default_config[some_var]
except:
return "Error"
# Получить статус процесса
def getState(process="CptHost.exe"):
if getOS() == 'windows':
try:
output = os.popen(f'tasklist /fi "IMAGENAME eq {process}" /fi "USERNAME ne NT AUTHORITY\{getpass.getuser()}"').read()
if process in output:
return True
else:
return False
except Exception as exp:
appendLog(f'Failed to get state using tasklist: {exp}')
output = os.popen('wmic process get description, processid').read()
if "CptHost.exe" in output:
return True
else:
return False
# Функция сохранения информации в json файл
def saveJson(filename, value):
with open(filename, 'w', encoding="utf-8") as f:
json.dump(value, f, indent=4, ensure_ascii=False)
f.close()

195
libinstaller.py Normal file
View File

@@ -0,0 +1,195 @@
# -*- 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#############################################################################")
#########################################################

415
main.py
View File

@@ -1,55 +1,148 @@
# -*- coding: utf-8 -*-
import sys import sys
import pip
import webbrowser import webbrowser
import os import os
import time
import platform import platform
import subprocess import subprocess
from daemon import install
from pathlib import Path from pathlib import Path
install('wget') from functions import *
install('zipfile')
install('requests') appendLog('main.py start initialized', startup=True)
setTitle("", getOS())
from daemon import main
import settings
import editor
import rpc
if getConfig("use_colors"):
from colors import *
else:
RESET = ''
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
ULINE = REVERSE = ''
import libinstaller
import wget import wget
import requests import requests
import keyboard
import getpass
from zipfile import ZipFile from zipfile import ZipFile
from daemon import main, editor, settings, clear
version = 1.4 version = 2.1
path = Path(__file__).resolve().parent path = Path(__file__).resolve().parent
def mainMenu(): def mainMenu():
try: try:
setTitle("AutoZoom (Главная)", getOS())
global version global version
global path global path
while True: appendLog('Main menu opened')
serv_ver = requests.get("https://www.end-play.xyz/AutoZoomVersion.txt").text rpc.inMenu()
if float(serv_ver) > float(version):
show_version = ' (!)'
else:
show_version = ''
#clear() while True:
menu_choose = input(f'» Главное меню\n\n1. Запуск\n2. Редактор\n3. Настройки\n4. Обновление{show_version}\n5. Помощь и связь\n6. Закрыть приложение\n\n > ') if getConfig("update_check"):
print(f'{RESET}Загрузка данных о последней версии...')
try:
setTitle("Загрузка данных...", getOS())
serv_ver = requests.get("https://www.end-play.xyz/AutoZoomVersion.txt").text
setTitle("AutoZoom (Главная)", getOS())
ignore = False
clear()
except Exception as exp:
appendLog(f'Version number load failed {exp}')
setTitle("Ошибка загрузки данных", getOS())
print(f'Не удалось загрузить данные о последней версии.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}')
todo = input(f'\nВведите {BRED}ignore {RESET}чтобы выключить проверку обновлений и продолжить\nлибо введите что угодно иное чтобы закрыть программу.\n\n > {BRED}')
if todo.lower() == 'ignore':
setConfig("update_check", False)
serv_ver = ''
appendLog('Skipping update check')
setTitle("AutoZoom (Главная)", getOS())
ignore = True
clear()
else:
rpc.disconnect()
sys.exit()
if ignore == False and float(serv_ver) > float(version):
show_version = f' ({BRED}!{RESET})'
else:
show_version = ''
else:
show_version = f' ({BRED}!{RESET})'
setTitle("AutoZoom (Главная)", getOS())
serv_ver = 'disabled'
appendLog('Skipping update check')
clear()
print(f'{BBLACK}»{RESET} Главное меню\n')
print(f' {BRED}1.{RESET} Запуск')
print(f' {BRED}2.{RESET} Редактор')
print(f' {BRED}3.{RESET} Настройки')
print(f' {BRED}4.{RESET} Обновление{show_version}')
print(f' {BRED}5.{RESET} Помощь и связь')
print(f' {BRED}6.{RESET} Закрыть приложение')
if getConfig("debug"):
print(f' {BRED}10.{RESET} Меню разработчика')
menu_choose = input(f'\n {RESET}> {BRED}')
print(RESET)
if menu_choose == '1': if menu_choose == '1':
appendLog('Went to daemon')
main('menu') main('menu')
elif menu_choose == '2': elif menu_choose == '2':
editor() appendLog('Went to editor')
rpc.inEditor()
editor.editor()
elif menu_choose == '3': elif menu_choose == '3':
settings() appendLog('Went to settings')
rpc.inSettings()
settings.settings()
elif menu_choose == '4': elif menu_choose == '4':
appendLog('Went to updater')
rpc.inUpdater()
updater(serv_ver, version) updater(serv_ver, version)
elif menu_choose == '5': elif menu_choose == '5':
appendLog('Went to help')
rpc.inHelp()
helpMenu() helpMenu()
elif menu_choose == '6': elif menu_choose == '6':
appendLog('Exited AutoZoom from main menu', shutdown=True)
rpc.disconnect()
clear() clear()
sys.exit() sys.exit()
elif menu_choose == '10':
if getConfig("debug"):
appendLog('Went to help')
rpc.inDebug()
devMenu()
else:
clear()
else: else:
clear() clear()
continue continue
except: except KeyboardInterrupt:
rpc.disconnect()
clear() clear()
print(f'Закрываем приложение {BGREEN}AutoZoom{RESET}...')
sys.exit()
def os_arch(): def os_arch():
is_64bits = sys.maxsize > 2**32 is_64bits = sys.maxsize > 2**32
@@ -62,71 +155,209 @@ def os_arch():
def helpMenu(): def helpMenu():
try: try:
while True: while True:
setTitle("AutoZoom (Помощь)", getOS())
appendLog('Help menu opened')
clear() clear()
global version global version
global path global path
help_choose = input(f'» Меню помощи\n\n1. Документация\n2. Telegram проекта\n3. Связаться с автором\n4. Сводка информации\n5. В главное меню\n\n > ')
print(f'{BBLACK}»{RESET} Меню помощи\n')
print(f' {BRED}1.{RESET} Документация')
print(f' {BRED}2.{RESET} Сайт проекта')
print(f' {BRED}3.{RESET} Центр поддержки')
print(f' {BRED}4.{RESET} Telegram проекта')
print(f' {BRED}5.{RESET} Связаться с автором')
print(f' {BRED}6.{RESET} Сводка информации')
print(f' {BRED}7.{RESET} В главное меню')
help_choose = input(f'\n > {BRED}')
if help_choose == '1': if help_choose == '1':
try: try:
clear() clear()
appendLog('Opened AutoZoom wiki')
webbrowser.open("https://github.com/profitrollgame/autozoom/wiki") webbrowser.open("https://github.com/profitrollgame/autozoom/wiki")
except: except Exception as exp:
clear() clear()
none = input('Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: https://github.com/profitrollgame/autozoom/wiki\n\n > ') appendLog(f'Failed to open AutoZoom wiki: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://github.com/profitrollgame/autozoom/wiki{RESET}\n\n > ')
clear() clear()
elif help_choose == '2': elif help_choose == '2':
try: try:
clear() clear()
webbrowser.open("https://t.me/auto_zoom") appendLog('Opened AutoZoom website')
except: webbrowser.open("https://www.end-play.xyz/autozoom")
except Exception as exp:
clear() clear()
none = input('Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: https://t.me/auto_zoom\n\n > ') appendLog(f'Failed to open AutoZoom website: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.end-play.xyz/autozoom{RESET}\n\n > ')
clear() clear()
elif help_choose == '3': elif help_choose == '3':
try: try:
clear() clear()
webbrowser.open("https://t.me/profitroll") appendLog('Opened AutoZoom support center')
except: webbrowser.open("https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3")
except Exception as exp:
clear() clear()
none = input('Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: https://t.me/profitroll\n\n > ') appendLog(f'Failed to open AutoZoom support center: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://www.tidio.com/talk/ydqcvfvgkud3jjk2482uaesvjpeohlh3{RESET}\n\n > ')
clear() clear()
if help_choose == '4': elif help_choose == '4':
clear() try:
print('» Информация о системе\n') clear()
print('Система:') appendLog('Opened AutoZoom Telegram group')
print(f'ОС: {platform.system()}') webbrowser.open("https://t.me/auto_zoom")
print(f'• Релиз: {platform.release()}') except Exception as exp:
print(f'• Разрядность: {os_arch()}') clear()
print('\nPython:') appendLog(f'Failed to open AutoZoom Telegram group: {exp}')
print(f'• Версия: {platform.python_version()}') none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/auto_zoom{RESET}\n\n > ')
print(f'• Вариант: {platform.python_implementation()}')
print(f'• Ревизия: {platform.python_revision()}')
print(f'• Расположение: {sys.path[4]}')
print('\nAutoZoom:')
print(f'• Версия: {version}')
print(f'• Расположение: {path}')
none = input('\n > ')
clear() clear()
elif help_choose == '5': elif help_choose == '5':
try:
clear()
appendLog('Opened AutoZoom\'s developer Telegram')
webbrowser.open("https://t.me/profitroll")
except Exception as exp:
clear()
appendLog(f'Failed to open AutoZoom\'s developer Telegram: {exp}')
none = input(f'{RESET}Не удалось открыть страницу вашего браузера.\nВы можете открыть адрес самостоятельно: {BRED}https://t.me/profitroll{RESET}\n\n > ')
clear() clear()
if help_choose == '6':
clear()
if getState("RBTray.exe"):
rbtray = f'{BGREEN}Активен{RESET}'
else:
rbtray = f'{BRED}Неактивен{RESET}'
if rpc.connected:
dsrpc = f'{BGREEN}Активен{RESET}'
else:
dsrpc = f'{BRED}Неактивен{RESET}'
appendLog(f'Showing system information:\n=============================================\nHelpful data for fault search:\n\nOS: {platform.system()}\nRelease: {platform.release()}\nArch: {os_arch()}\nPy Ver: {platform.python_version()}\nPIP Ver: {pip.__version__}\nImpl: {platform.python_implementation()}\nRev: {platform.python_revision()}\nPy Path: {sys.path[4]}\nAZ Ver: {version}\nAZ User: {getpass.getuser()}\nAZ User Home: {Path.home()}\nAZ Path: {path}\nRBTray: {str(getState("RBTray.exe"))}\nRPC: {str(rpc.connected)}\n=============================================')
print(f'{BBLACK}»{RESET} Информация о системе\n')
print(' Система:')
print(f' {BBLACK}{RESET} ОС: {YELLOW}{platform.system()}{RESET}')
print(f' {BBLACK}{RESET} Релиз: {YELLOW}{platform.release()}{RESET}')
print(f' {BBLACK}{RESET} Разрядность: {YELLOW}{os_arch()}{RESET}')
print('\n Python:')
print(f' {BBLACK}{RESET} Версия: {YELLOW}{platform.python_version()}{RESET}')
print(f' {BBLACK}{RESET} Версия PIP: {YELLOW}{pip.__version__}{RESET}')
print(f' {BBLACK}{RESET} Вариант: {YELLOW}{platform.python_implementation()}{RESET}')
print(f' {BBLACK}{RESET} Ревизия: {YELLOW}{platform.python_revision()}{RESET}')
print(f' {BBLACK}{RESET} Расположение: {BRED}{sys.path[4]}{RESET}')
print('\n AutoZoom:')
print(f' {BBLACK}{RESET} Версия: {YELLOW}{version}{RESET}')
print(f' {BBLACK}{RESET} Пользователь: {YELLOW}{getpass.getuser()}{RESET}')
print(f' {BBLACK}{RESET} Папка пользователя: {BRED}{Path.home()}{RESET}')
print(f' {BBLACK}{RESET} Расположение: {BRED}{path}{RESET}')
print('\n Интеграции:')
print(f' {BBLACK}{RESET} RBTray: {rbtray}')
print(f' {BBLACK}{RESET} Discord RPC: {dsrpc}')
none = input('\n > ')
clear()
elif help_choose == '7':
rpc.inMenu()
clear()
setTitle("AutoZoom (Главная)", getOS())
return return
else: else:
clear() clear()
continue continue
except KeyboardInterrupt: except KeyboardInterrupt:
rpc.inMenu()
clear() clear()
return return
def devMenu():
try:
while True:
setTitle("AutoZoom (Отладка)", getOS())
appendLog('Help menu opened')
clear()
print(f'{BBLACK}»{RESET} Меню отладки\n')
print(f' {BRED}1.{RESET} PlaySound test')
print(f' {BRED}2.{RESET} WinSound test')
print(f' {BRED}3.{RESET} Play-audio test')
print(f' {BRED}4.{RESET} OS check test')
print(f' {BRED}5.{RESET} Telegram test')
print(f' {BRED}6.{RESET} Color test')
print(f' {BRED}7.{RESET} Exit to menu')
choose = input(f'\n > {BRED}')
if choose == '1':
from playsound import playsound
playsound(sounds_folder+"debug.wav")
continue
elif choose == '2':
import winsound
winsound.PlaySound(sounds_folder+"debug.wav", winsound.SND_FILENAME)
continue
elif choose == '3':
os.system(f'play-audio {sounds_folder}debug.wav')
continue
elif choose == '4':
clear()
none = input(f'{RESET}{getOS()}\n\n > ')
continue
elif choose == '5':
clear()
import telegram_send
telegram_send.send(messages=["Telegram message test"], parse_mode="markdown", conf=files_folder+"telegram.conf")
continue
elif choose == '6':
clear()
print(f'{BLACK}███{RED}███{GREEN}███{YELLOW}███{BLUE}███{MAGENTA}███{CYAN}███{WHITE}███')
print(f'{BBLACK}███{BRED}███{BGREEN}███{BYELLOW}███{BBLUE}███{BMAGENTA}███{BCYAN}███{BWHITE}███')
print(f'{RESET}RESET')
print(f'{REVERSE}REVERSE{RESET}')
print(f'{ULINE}UNDERLINE{RESET}')
none = input(RESET+'\n > ')
continue
elif choose == '7':
rpc.inMenu()
clear()
setTitle("AutoZoom (Главная)", getOS())
return
else:
clear()
continue
except KeyboardInterrupt:
rpc.inMenu()
clear()
return
def updater(serv_ver, version): def updater(serv_ver, version):
try: try:
while True: while True:
setTitle("AutoZoom (Обновления)", getOS())
appendLog('Updater menu opened')
clear() clear()
if float(serv_ver) > float(version):
show_version = ' (!)' if getConfig("update_check") and float(serv_ver) > float(version):
show_version = f' ({BRED}!{RESET})'
serv_ver = serv_ver.rstrip('\n') serv_ver = serv_ver.rstrip('\n')
show_action = f'Обновить до {serv_ver}' show_action = f'Обновить до {BGREEN}{serv_ver}{RESET}'
changelog_text = f'Изменения в версии {serv_ver}:' changelog_text = f'Изменения в версии {BGREEN}{serv_ver}{RESET}:'
changelog_footer = '\nОбновитесь чтобы вышеуказанное работало.' changelog_footer = '\nОбновитесь чтобы вышеуказанное работало.'
elif serv_ver == 'disabled':
show_version = ''
show_action = f'Переустановить'
changelog_text = f'Изменения в вашей версии:'
changelog_footer = ''
else: else:
show_version = '' show_version = ''
show_action = f'Переустановить' show_action = f'Переустановить'
@@ -134,52 +365,106 @@ def updater(serv_ver, version):
changelog_footer = '' changelog_footer = ''
updater_choose = input(f'» Меню обновлений\n\n1. {show_action}\n2. Список изменений\n3. В главное меню\n\n > ') print(f'{BBLACK}»{RESET} Меню обновлений\n')
print(f' {BRED}1.{RESET} {show_action}')
print(f' {BRED}2.{RESET} Список изменений')
print(f' {BRED}3.{RESET} В главное меню')
if not getConfig("update_check"):
print(f'\n{BRED}Внимание!{RESET} У вас выключена проверка обновлений.\nЕсли это было сделанно временно - включите её в настройках.')
updater_choose = input(f'\n > {BRED}')
if updater_choose == '1': if updater_choose == '1':
appendLog('Choosed to update')
while True: while True:
clear() clear()
updater_decide = input(f'1. Установить\n2. Отменить\n\n > ') print(f'{RESET}Подтвердите действие:\n')
print(f' {BRED}1.{RESET} Установить')
print(f' {BRED}2.{RESET} Отменить')
updater_decide = input(f'\n > {BRED}')
if updater_decide == '1': if updater_decide == '1':
appendLog('Trying to update AutoZoom')
clear() clear()
wget.download('https://www.end-play.xyz/AutoZoomLatest.zip', out='AutoZoomLatest.zip') try:
wget.download('https://www.end-play.xyz/AutoZoomLatest.zip', out='AutoZoomLatest.zip')
appendLog('Latest zip downloaded')
except Exception as exp:
print(f'{RESET}Не удалось загрузить архив с последней версией.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}')
appendLog(f'Failed to download zip: {exp}')
none = input(f'\n > {BRED}')
continue
with ZipFile('AutoZoomLatest.zip', 'r') as zipObj: with ZipFile('AutoZoomLatest.zip', 'r') as zipObj:
zipObj.extractall() zipObj.extractall()
print('Все файлы были успешно загружены') print(f'{RESET}Все файлы были успешно загружены')
appendLog('Latest zip extracted')
if os.path.exists("AutoZoomLatest.zip"): if os.path.exists("AutoZoomLatest.zip"):
os.remove("AutoZoomLatest.zip") os.remove("AutoZoomLatest.zip")
appendLog('Latest used zip deleted')
clear() clear()
none = input('Обновление завершено, перезапустите AutoZoom.\n\n > ') none = input(f'{RESET}Обновление завершено, перезапустите AutoZoom.\n\n > ')
rpc.disconnect()
clear()
print(f'{RESET}Закрываем приложение {BGREEN}AutoZoom{RESET}...')
appendLog('Exiting AutoZoom after an update')
sys.exit() sys.exit()
elif updater_decide == '2': elif updater_decide == '2':
clear() clear()
appendLog('Aborted update')
break break
else: else:
continue continue
elif updater_choose == '2': elif updater_choose == '2':
changelog = requests.get("https://www.end-play.xyz/AutoZoomChangelog.txt") appendLog('Choosed to check changelog')
changelog.encoding = None try:
clear() changelog = requests.get("https://www.end-play.xyz/AutoZoomChangelog.txt")
print(f'{changelog_text}\n') changelog.encoding = None
print(changelog.text) appendLog('Changelog loaded')
print(changelog_footer) clear()
print(f'{RESET}{changelog_text}\n')
none = input('\n > ') print(changelog.text)
continue print(changelog_footer)
none = input('\n > ')
continue
except Exception as exp:
clear()
print(f'{RESET}Не удалось загрузить чейнджлог.\nПроверьте подключение к сети и повторите попытку.\n\nСтатус сервера центра обновлений:\n{BRED}https://status.end-play.xyz/786373747{RESET}')
appendLog(f'Failed to check changelog: {exp}')
none = input('\n > ')
continue
elif updater_choose == '3': elif updater_choose == '3':
rpc.inMenu()
clear() clear()
appendLog('Returning to main menu')
setTitle("AutoZoom (Главная)", getOS())
return return
else: else:
continue continue
except:
except KeyboardInterrupt:
rpc.inMenu()
clear() clear()
return return
if __name__ == '__main__': if __name__ == '__main__':
from daemon import clear from functions import getConfig
from daemon import clear, getOS, setTitle
import time
setTitle("Загрузка main...", getOS())
clear() clear()
mainMenu() if getConfig("run_fullscreen"):
keyboard.press('alt, enter')
time.sleep(.25)
keyboard.release('alt, enter')
setTitle("AutoZoom (Главная)", getOS())
mainMenu()
sys.exit()

247
rpc.py Normal file
View File

@@ -0,0 +1,247 @@
# -*- 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)

538
settings.py Normal file
View File

@@ -0,0 +1,538 @@
import rpc
import pathlib
import shutil
from functions import *
#from daemon import
if getConfig("use_colors"):
from colors import *
appendLog('Colors imported')
else:
RESET = ''
BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = ''
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
ULINE = REVERSE = ''
appendLog('Loading without colors')
sysname = getOS()
if sysname == "windows":
from swinlnk.swinlnk import SWinLnk
swl = SWinLnk()
def settings():
appendLog('Settings page 1 opened')
global sysname
try:
while True:
setTitle("AutoZoom (Настройки)", sysname)
clear()
if getConfig("debug"):
debug_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("debug"):
debug_val = f'{BRED}Выкл.{RESET}'
else:
debug_val = f'{BRED}ERROR{RESET}'
if getConfig("run_fullscreen"):
fullscreen_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("run_fullscreen"):
fullscreen_val = f'{BRED}Выкл.{RESET}'
else:
fullscreen_val = f'{BRED}ERROR{RESET}'
if getConfig("sounds"):
sounds_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("sounds"):
sounds_val = f'{BRED}Выкл.{RESET}'
else:
sounds_val = f'{BRED}ERROR{RESET}'
if getConfig("obs_exe") and getConfig("obs_core") not in [None, 'Disabled']:
obs_val = f'{BGREEN}Вкл.{RESET}'
else:
obs_val = f'{BRED}Выкл.{RESET}'
if getConfig("use_colors"):
color_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("use_colors"):
color_val = f'{BRED}Выкл.{RESET}'
else:
color_val = f'{BRED}ERROR{RESET}'
if getConfig("shutdown_enabled"):
shutdown_en_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("shutdown_enabled"):
shutdown_en_val = f'{BRED}Выкл.{RESET}'
else:
shutdown_en_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start")
stop_val = getConfig("stop")
print(f'{RESET}{BBLACK}»{RESET} Настройки (1 стр.)\n')
print(f' {BRED}1.{RESET} Режим отладки ({debug_val})')
print(f' {BBLACK}Не рекомендуем включать его без необходимости\n')
print(f' {BRED}2.{RESET} Цветной вывод ({color_val})')
print(f' {BBLACK}Отображение цветных текстов в меню и выводе (нужен перезапуск)\n')
print(f' {BRED}3.{RESET} Полный экран ({fullscreen_val})')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Эмулировать вызов полного экрана при запуске (окно должно быть в фокусе)\n')
print(f' {BRED}4.{RESET} Звуковые сигналы ({sounds_val})')
print(f' {BBLACK}Воспроизводить звуки при начале/конце конференций и записи видео\n')
print(f' {BRED}5.{RESET} Запись через OBS ({obs_val})')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Возможность записи конференций через OBS\n')
print(f' {BRED}6.{RESET} Автовыключение ({shutdown_en_val})')
print(f' {BBLACK}Когда конференции закончатся компьютер выключится\n')
print(f' {BRED}7.{RESET} Следующая страница')
print(f' {BBLACK}Перейти на вторую страницу настроек\n')
print(f' {BRED}8.{RESET} В главное меню')
print(f' {BBLACK}Вернуться в основное меню{RESET}\n')
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
settings_choose = input(f'\n > {BRED}')
if settings_choose == '1':
setConfig("debug", not getConfig("debug"))
appendLog(f'Changed option "debug" to {getConfig("debug")}')
clear()
continue
elif settings_choose == '2':
setConfig("use_colors", not getConfig("use_colors"))
appendLog(f'Changed option "use_colors" to {getConfig("use_colors")}')
clear()
continue
elif settings_choose == '3':
if sysname == 'windows':
setConfig("run_fullscreen", not getConfig("run_fullscreen"))
appendLog(f'Changed option "run_fullscreen" to {getConfig("run_fullscreen")}')
clear()
continue
elif settings_choose == '4':
setConfig("sounds", not getConfig("sounds"))
appendLog(f'Changed option "sounds" to {getConfig("sounds")}')
clear()
continue
elif settings_choose == '5':
if sysname == 'windows':
if getConfig("obs_core") and getConfig("obs_exe") not in [None, 'Disabled']:
setConfig("obs_core", "Disabled")
setConfig("obs_exe", "Disabled")
else:
clear()
obs_choice = input(f'{RESET}Хотите использовать запись через OBS? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET}): ')
if obs_choice.lower() in yes_list:
while True:
try:
filename = easygui.fileopenbox('Выберите путь до obs32.exe или obs64.exe')
if filename.find("obs64.exe") != -1:
setConfig("obs_exe", filename)
setConfig("obs_core", filename[:-9])
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs32.exe") != -1:
setConfig("obs_exe", filename)
setConfig("obs_core", filename[:-9])
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-9]}{RESET}')
time.sleep(3)
break
elif filename.find("obs.exe") != -1:
setConfig("obs_exe", filename)
setConfig("obs_core", filename[:-7])
print(f'Сохранены пути для OBS:\nПриложение: {BRED}{filename}{RESET}\nКорневая папка: {BRED}{filename[:-7]}{RESET}')
time.sleep(3)
break
else:
easygui.msgbox("Неверный путь")
break
except Exception as exp:
appendLog(f'Could not select OBS path: {exp}')
none = input('Вы не выбрали верный путь для OBS.\n\n > ')
clear()
break
appendLog(f'Changed option "obs_exe" to {getConfig("obs_exe")}')
appendLog(f'Changed option "obs_core" to {getConfig("obs_core")}')
clear()
continue
elif settings_choose == '6':
setConfig("shutdown_enabled", not getConfig("shutdown_enabled"))
appendLog(f'Changed option "shutdown_enabled" to {getConfig("shutdown_enabled")}')
clear()
continue
elif settings_choose == '7':
clear()
settings2()
elif settings_choose == '8':
rpc.inMenu()
clear()
setTitle("AutoZoom (Главная)", sysname)
return
except KeyboardInterrupt:
rpc.inMenu()
clear()
return
def settings2():
appendLog('Settings page 2 opened')
global sysname
try:
while True:
setTitle("AutoZoom (Настройки)", sysname)
clear()
if getConfig("use_colors"):
color_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("use_colors"):
color_val = f'{BRED}Выкл.{RESET}'
else:
color_val = f'{BRED}ERROR{RESET}'
if os.path.exists(files_folder+'telegram.conf'):
tg_file = open(files_folder+'telegram.conf', 'r', encoding="utf-8")
tg_text = tg_file.read()
if tg_text != 'Not Configured':
tg_var = f'{BGREEN}Настроен{RESET}'
else:
tg_var = f'{BRED}Не настроен{RESET}'
else:
tg_var = f'{BRED}Не настроен{RESET}'
if getConfig("telegram_enabled"):
telegram_en_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("telegram_enabled"):
telegram_en_val = f'{BRED}Выкл.{RESET}'
else:
telegram_en_val = f'{BRED}ERROR{RESET}'
if getConfig("update_check"):
update_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("update_check"):
update_val = f'{BRED}Выкл.{RESET}'
else:
update_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start")
stop_val = getConfig("stop")
print(f'{RESET}{BBLACK}»{RESET} Настройки (2 стр.)\n')
print(f' {BRED}1.{RESET} Таймаут выключения ({YELLOW}{shutdown_time_val} мин.{RESET})')
print(f' {BBLACK}Время в минутах после которого ПК будет выключен\n')
print(f' {BRED}2.{RESET} Начать запись ({YELLOW}{start_val}{RESET})')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Комбинация клавиш для начала записи через OBS (см. документацию)\n')
print(f' {BRED}3.{RESET} Остановить запись ({YELLOW}{stop_val}{RESET})')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Комбинация клавиш для остановки записи через OBS (см. документацию)\n')
print(f' {BRED}4.{RESET} Отправлять уведомления ({telegram_en_val})')
print(f' {BBLACK}Ваш бот отправит сообщениия о начале/конце конференции и выключении ПК\n')
print(f' {BRED}5.{RESET} Настроить Telegram бота ({tg_var})')
print(f' {BBLACK}Настроить на вашем ПК бота для ЛС (см. документацию)\n')
print(f' {BRED}6.{RESET} Проверка обновлений ({update_val})')
print(f' {BBLACK}Ускоряет загрузку меню, но не рекомендуем выключать без необходимости\n')
print(f' {BRED}7.{RESET} Следующая страница')
print(f' {BBLACK}Перейти на третью страницу настроек\n')
print(f' {BRED}8.{RESET} Назад')
print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n')
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
settings_choose = input(f'\n > {BRED}')
if settings_choose == '1':
try:
clear()
shutdown_timeout_val = int(input(f'{RESET}Введите через сколько минут после конференции выключать ПК:\n\n > {BRED}'))
setConfig("shutdown_timeout", shutdown_timeout_val)
appendLog(f'Changed option "shutdown_timeout" to {getConfig("shutdown_timeout")}')
continue
except:
clear()
print(f'{RESET}Нужно использовать целое число.')
time.sleep(2)
continue
continue
elif settings_choose == '2':
if sysname == 'windows':
try:
clear()
start_value = input(f'{RESET}Введите комбинацию клавиш для начала записи OBS:\nЭта комбинация должна быть идентична оной в самом OBS!\n\n > {YELLOW}')
setConfig("start", start_value)
appendLog(f'Changed option "start" to {getConfig("start")}')
continue
except:
clear()
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2)
continue
clear()
continue
elif settings_choose == '3':
if sysname == 'windows':
try:
clear()
stop_value = input(f'{RESET}Введите комбинацию клавиш для остановки записи OBS:\nЭта комбинация должна быть идентична оной в самом OBS!\n\n > {YELLOW}')
setConfig("stop", stop_value)
appendLog(f'Changed option "stop" to {getConfig("stop")}')
continue
except:
clear()
print(f'{RESET}Нужно использовать комбинацию клавиш в виде текста.')
time.sleep(2)
continue
clear()
continue
elif settings_choose == '4':
setConfig("telegram_enabled", not getConfig("telegram_enabled"))
appendLog(f'Changed option "telegram_enabled" to {getConfig("telegram_enabled")}')
clear()
continue
elif settings_choose == '5':
clear()
print(f'{RESET}Пожалуйста, прочтите инструкцию по установке Telegram бота в {BRED}README.txt{RESET}')
print(f'или в документации/инструкции что в разделе {CYAN}Помощь{RESET} главного меню')
print(f'чтобы хорошо понимать что сейчас от вас нужно.')
none = input('\n > ')
while True:
clear()
try:
telegram_send.configure(files_folder+'telegram.conf', channel=False, group=False, fm_integration=False)
break
except:
clear()
continue
telegram_send.send(messages=[f"🎊 Конфигурация правильна, всё работает!"], parse_mode="markdown", conf=f"{files_folder}telegram.conf")
appendLog('Telegram Send successfully configured')
clear()
continue
elif settings_choose == '6':
setConfig("update_check", not getConfig("update_check"))
appendLog(f'Changed option "update_check" to {getConfig("update_check")}')
clear()
continue
elif settings_choose == '7':
appendLog('Going to settings page 3')
clear()
settings3()
elif settings_choose == '8':
appendLog('Returned to settings page 1')
clear()
return
except KeyboardInterrupt:
rpc.inMenu()
clear()
return
def settings3():
appendLog('Settings page 3 opened')
try:
while True:
setTitle("AutoZoom (Настройки)", sysname)
clear()
if getConfig("write_logs"):
logs_val = f'{BGREEN}Вкл.{RESET}'
elif not getConfig("write_logs"):
logs_val = f'{BRED}Выкл.{RESET}'
else:
logs_val = f'{BRED}ERROR{RESET}'
shutdown_time_val = getConfig("shutdown_timeout")
start_val = getConfig("start")
stop_val = getConfig("stop")
print(f'{RESET}{BBLACK}»{RESET} Настройки (3 стр.)\n')
print(f' {BRED}1.{RESET} Запись действий в лог ({logs_val})')
print(f' {BBLACK}Запись каждого действия в файл для отладки (не выключайте без причин)\n')
print(f' {BRED}2.{RESET} Размер лога действий ({YELLOW}{str(getConfig("log_size"))} Кб{RESET})')
print(f' {BBLACK}Размер файла лога превышая который он будет упакован в архив\n')
print(f' {BRED}3.{RESET} Добавить в автозапуск')
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Автоматически запускать демона при входе в систему\n')
print(f' {BRED}4.{RESET} Сбросить все настройки')
print(f' {BBLACK}Восстановить настройки по умолчанию\n')
print(f' {BRED}5.{RESET} Назад')
print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n')
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
settings_choose = input(f'\n > {BRED}')
if settings_choose == '1':
setConfig("write_logs", not getConfig("write_logs"))
appendLog(f'Changed option "write_logs" to {getConfig("write_logs")}')
if settings_choose == '2':
try:
clear()
log_size_value = int(input(f'{RESET}Введите после скольки килобайт архивировать лог:\n\n > {BRED}'))
setConfig("log_size", log_size_value)
continue
except:
clear()
print(f'{RESET}Нужно использовать целое число.')
time.sleep(2)
continue
appendLog(f'Changed option "log_size" to {getConfig["log_size"]}')
continue
if settings_choose == '3':
if sysname == "windows":
global swl
try:
clear()
shutil.copyfile('daemon.bat', 'startdaemon.bat')
with open('startdaemon.bat', 'r') as f :
filedata = f.read()
filedata = filedata.replace('python daemon.py', f'python {path}\\daemon.py')
with open('startdaemon.bat', 'w') as f:
f.write(filedata)
f.close()
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')
none = input(f'Демон AutoZoom был добавлен в автозапуск.\nПуть: {BRED}{pathlib.Path.home()}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\AutoZoomDaemon.lnk{RESET}\n\n > ')
continue
except Exception as exp:
clear()
none = input(f'Не удалось добавить в автозапуск:\n{BRED}{exp}{RESET}\n\n > ')
appendLog(f'Could not add autorun: {exp}')
continue
continue
else:
continue
elif settings_choose == '4':
appendLog('Resetting configuration')
while True:
clear()
reset_decision = input(f'{RESET}Вы уверены что хотите сбросить настройки? {RESET}({BGREEN}Да{RESET}/{BRED}Нет{RESET})\n\n{BRED}Внимание!{RESET} Это действие нельзя обратить!\nВаш список конференций затронут НЕ будет.\n\n > ')
if reset_decision.lower() in yes_list:
from functions import default_config
saveJson(files_folder+'config.json', default_config)
appendLog('Configuration dropped to default')
clear()
none = input(f'{RESET}Все настройки были сброшены до стандартных.\n\n > ')
clear()
break
elif reset_decision.lower() in no_list:
appendLog('Configuration reset aborted')
clear()
break
else:
clear()
continue
continue
clear()
continue
elif settings_choose == '5':
appendLog('Returned to settings page 2')
clear()
return
except KeyboardInterrupt:
rpc.inMenu()
clear()
return

BIN
sounds/debug.wav Normal file

Binary file not shown.

BIN
sounds/recordstart.wav Normal file

Binary file not shown.

BIN
sounds/recordstop.wav Normal file

Binary file not shown.

BIN
sounds/warning.wav Normal file

Binary file not shown.

View File

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

4
start.sh Normal file
View File

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