Compare commits
No commits in common. "master" and "v2.3" have entirely different histories.
@ -39,15 +39,9 @@ AutoZoom создан для автоматизации присоединени
|
|||||||
2. Попробуйте запустить ваш `start.bat` в папке `AutoZoom`. Возможно, он сам отправит вас на страницу загрузки Python.
|
2. Попробуйте запустить ваш `start.bat` в папке `AutoZoom`. Возможно, он сам отправит вас на страницу загрузки Python.
|
||||||
Если же этого не произошло - сделать это можно вручную с официального сайта или из магазина приложений
|
Если же этого не произошло - сделать это можно вручную с официального сайта или из магазина приложений
|
||||||
Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?activetab=pivot:overviewtab&source=lp).
|
Microsoft Store (https://www.microsoft.com/ru-ru/p/python-37/9nj46sx7x90p?activetab=pivot:overviewtab&source=lp).
|
||||||
В случае установки без MS Store - достаточно скачать инсталлер с оф. сайта Python (https://www.python.org/downloads/).
|
|
||||||
Для установки на Linux необходимо использовать стандартный менеджер пакетов (apt, yum, rpm и т.д.)
|
|
||||||
Инструкции по установке версий Python3 на Linux вы можете самостоятельно в зависимости от дистрибутива
|
|
||||||
и желаемой к установке версии Python3.
|
|
||||||
Для установки на Android (в данном случае - внутри Termux) нужно ввести `pkg install python`.
|
|
||||||
|
|
||||||
3. Дважды нажмите на `start.bat` и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой
|
3. Дважды нажмите на `start.bat` и выберите пункт "Редактор" чтобы редактировать ваши уроки на любой
|
||||||
удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение.
|
удобный день. Введите все нужные данные. Название конференции, дату, время, ссылку на приглашение.
|
||||||
В случае установки на Linux/Android - скрипт запуска будет `start.sh` и его можно запустить через `bash ./start.sh`
|
|
||||||
|
|
||||||
4. Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК.
|
4. Теперь самая важная часть. Установите Zoom (https://zoom.us/download) на свой ПК.
|
||||||
Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО
|
Запустите его и зарегистрируйтесь/войдите в аккаунт. При входе ОБЯЗАТЕЛЬНО
|
||||||
|
57
daemon.py
57
daemon.py
@ -55,12 +55,12 @@ except Exception as exp:
|
|||||||
|
|
||||||
def nowtime(seconds=True, noice=True, color=True):
|
def nowtime(seconds=True, noice=True, color=True):
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
if seconds:
|
if seconds == True:
|
||||||
justnow = now.strftime("%H:%M:%S")
|
justnow = now.strftime("%H:%M:%S")
|
||||||
else:
|
else:
|
||||||
justnow = now.strftime("%H:%M")
|
justnow = now.strftime("%H:%M")
|
||||||
|
|
||||||
if noice:
|
if noice == True:
|
||||||
if not color:
|
if not color:
|
||||||
beautiful = f'[{justnow}]'
|
beautiful = f'[{justnow}]'
|
||||||
else:
|
else:
|
||||||
@ -122,7 +122,7 @@ def tgsend(enabled, message):
|
|||||||
|
|
||||||
except Exception as excep:
|
except Exception as excep:
|
||||||
appendLog(f'Failed to send TG message "{message}": {exp}')
|
appendLog(f'Failed to send TG message "{message}": {exp}')
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
print(f'{nowtime()} Не удалось отправить Telegram сообщение "{message}" (Ошибка: {exp})')
|
print(f'{nowtime()} Не удалось отправить Telegram сообщение "{message}" (Ошибка: {exp})')
|
||||||
|
|
||||||
|
|
||||||
@ -380,17 +380,17 @@ def main(source='deamon'):
|
|||||||
|
|
||||||
if getConfig("debug"):
|
if getConfig("debug"):
|
||||||
if retries == 2:
|
if retries == 2:
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* обнаружена {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* обнаружена {profilename}")
|
||||||
|
|
||||||
if retries == 36:
|
if retries == 36:
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 3 минуты {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 3 минуты {profilename}")
|
||||||
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}3{RESET} минуты')
|
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}3{RESET} минуты')
|
||||||
appendLog(f'Lesson delay exceeded: {retries} retries')
|
appendLog(f'Lesson delay exceeded: {retries} retries')
|
||||||
|
|
||||||
if retries == 120:
|
if retries == 120:
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 10 минут {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 10 минут {profilename}")
|
||||||
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}10{RESET} минут')
|
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}10{RESET} минут')
|
||||||
appendLog(f'Lesson delay exceeded: {retries} retries')
|
appendLog(f'Lesson delay exceeded: {retries} retries')
|
||||||
@ -398,17 +398,17 @@ def main(source='deamon'):
|
|||||||
if retries == 360:
|
if retries == 360:
|
||||||
|
|
||||||
if getConfig("debug"):
|
if getConfig("debug"):
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
|
||||||
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
|
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
|
||||||
else:
|
else:
|
||||||
playSound(getConfig("sound_warning"), nowtime())
|
playSound("warning", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"⚠ Задержка конференции *{lesson_name}* превысила 30 минут, конференция сбошена {profilename}")
|
||||||
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
|
print(f'{nowtime()} Задержка конференции {CYAN}{lesson_name}{RESET} превысила {BRED}30{RESET} минут, конференция сброшена')
|
||||||
|
|
||||||
appendLog(f'Lesson delay exceeded: {retries} retries')
|
appendLog(f'Lesson delay exceeded: {retries} retries')
|
||||||
|
|
||||||
playSound(getConfig("sound_ended"), nowtime())
|
playSound("ended", nowtime())
|
||||||
|
|
||||||
if lesson_obs:
|
if lesson_obs:
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ def main(source='deamon'):
|
|||||||
|
|
||||||
setTitle(f'Идёт конференция "{lesson_name}"', sysname)
|
setTitle(f'Идёт конференция "{lesson_name}"', sysname)
|
||||||
|
|
||||||
playSound(getConfig("sound_started"), nowtime())
|
playSound("started", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"▶ Зашёл на конференцию *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"▶ Зашёл на конференцию *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
|
||||||
|
|
||||||
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
|
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
|
||||||
@ -486,7 +486,7 @@ def main(source='deamon'):
|
|||||||
try:
|
try:
|
||||||
obs_process = subprocess.Popen(getConfig("obs_exe"), cwd=getConfig("obs_core"))
|
obs_process = subprocess.Popen(getConfig("obs_exe"), cwd=getConfig("obs_core"))
|
||||||
appendLog(f'Sent instruction to open OBS')
|
appendLog(f'Sent instruction to open OBS')
|
||||||
time.sleep(getConfig("obs_delay"))
|
time.sleep(5)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
appendLog(f'Failed to open OBS: {exp}')
|
appendLog(f'Failed to open OBS: {exp}')
|
||||||
print(f'{nowtime()} Не удалось открыть OBS для записи.')
|
print(f'{nowtime()} Не удалось открыть OBS для записи.')
|
||||||
@ -503,7 +503,7 @@ def main(source='deamon'):
|
|||||||
keyboard.release(start)
|
keyboard.release(start)
|
||||||
record_now = True
|
record_now = True
|
||||||
print(f'{nowtime()} Сигнал записи OBS отправлен.')
|
print(f'{nowtime()} Сигнал записи OBS отправлен.')
|
||||||
playSound(getConfig("sound_recordstart"), nowtime())
|
playSound("recordstart", nowtime())
|
||||||
|
|
||||||
lesson_duration = (datetime.now() - lesson_start).total_seconds()
|
lesson_duration = (datetime.now() - lesson_start).total_seconds()
|
||||||
|
|
||||||
@ -538,14 +538,14 @@ def main(source='deamon'):
|
|||||||
|
|
||||||
appendLog(f'Lesson {lesson_name} duration was {str(int(lesson_duration/60))} m. ({str(lesson_duration)} s.)')
|
appendLog(f'Lesson {lesson_name} duration was {str(int(lesson_duration/60))} m. ({str(lesson_duration)} s.)')
|
||||||
|
|
||||||
playSound(getConfig("sound_ended"), nowtime())
|
playSound("ended", nowtime())
|
||||||
|
|
||||||
if lesson_obs:
|
if lesson_obs:
|
||||||
keyboard.press(stop)
|
keyboard.press(stop)
|
||||||
time.sleep(.25)
|
time.sleep(.25)
|
||||||
keyboard.release(stop)
|
keyboard.release(stop)
|
||||||
print(f'{nowtime()} Сигнал остановки записи через OBS отправлен.')
|
print(f'{nowtime()} Сигнал остановки записи через OBS отправлен.')
|
||||||
playSound(getConfig("sound_recordstop"), nowtime())
|
playSound("recordstop", nowtime())
|
||||||
record_now = False
|
record_now = False
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
|
||||||
@ -579,7 +579,7 @@ def main(source='deamon'):
|
|||||||
lessons_list = getLessons()
|
lessons_list = getLessons()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
playSound(getConfig("sound_started"), nowtime())
|
playSound("started", nowtime())
|
||||||
tgsend(getConfig("telegram_enabled"), f"▶ Присоединился к конференции *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
|
tgsend(getConfig("telegram_enabled"), f"▶ Присоединился к конференции *{lesson_name}* в *{nowtime(False, False, False)}* {profilename}")
|
||||||
|
|
||||||
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
|
appendLog(f'Joined lesson {lesson_name} at {nowtime(False, False, False)}')
|
||||||
@ -622,7 +622,7 @@ def main(source='deamon'):
|
|||||||
|
|
||||||
appendLog(f'Shutting PC down in {str(getConfig("shutdown_timeout"))}')
|
appendLog(f'Shutting PC down in {str(getConfig("shutdown_timeout"))}')
|
||||||
|
|
||||||
playSound(getConfig("sound_shutdown"), nowtime())
|
playSound("shutdown", nowtime())
|
||||||
end_unix = int(time.time())+getConfig("shutdown_timeout")*60
|
end_unix = int(time.time())+getConfig("shutdown_timeout")*60
|
||||||
rpc.shutdown(end_unix)
|
rpc.shutdown(end_unix)
|
||||||
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить выключение ПК...', timeout=getConfig("shutdown_timeout")*60)
|
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить выключение ПК...', timeout=getConfig("shutdown_timeout")*60)
|
||||||
@ -637,28 +637,6 @@ def main(source='deamon'):
|
|||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
appendLog('Shutting PC down')
|
appendLog('Shutting PC down')
|
||||||
os.system("shutdown /s /t 1")
|
os.system("shutdown /s /t 1")
|
||||||
elif getConfig("end_mode") == 'sleep':
|
|
||||||
try:
|
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Конференции кончились, отправление в сон {profilename}через {str(getConfig('shutdown_timeout'))} мин...")
|
|
||||||
print(f'{nowtime()} Ваш ПК автоматически заснёт через {BRED}{str(getConfig("shutdown_timeout"))} мин{RESET}.')
|
|
||||||
|
|
||||||
appendLog(f'Falling asleep in {str(getConfig("shutdown_timeout"))}')
|
|
||||||
|
|
||||||
playSound(getConfig("sound_shutdown"), nowtime())
|
|
||||||
end_unix = int(time.time())+getConfig("shutdown_timeout")*60
|
|
||||||
rpc.sleepmode(end_unix)
|
|
||||||
shutdown = inputimeout(prompt=f'{nowtime()} Нажмите {CYAN}Enter{RESET} чтобы предотвратить засыпание ПК...', timeout=getConfig("shutdown_timeout")*60)
|
|
||||||
|
|
||||||
appendLog('Sleep mode aborted')
|
|
||||||
clear()
|
|
||||||
except TimeoutOccurred:
|
|
||||||
clear()
|
|
||||||
print(f'{nowtime()} Время вышло, уводим ваш ПК в спящий режим...')
|
|
||||||
time.sleep(3)
|
|
||||||
tgsend(getConfig("telegram_enabled"), f"⚠ Время таймаута исткело, переводим ПК в спящий режим...")
|
|
||||||
time.sleep(5)
|
|
||||||
appendLog('Activating PC sleep mode')
|
|
||||||
os.system("rundll32.exe powrprof.dll, SetSuspendState Sleep")
|
|
||||||
# elif getConfig("end_mode") == 'restart':
|
# elif getConfig("end_mode") == 'restart':
|
||||||
# from datetime import datetime, time
|
# from datetime import datetime, time
|
||||||
# from time import sleep
|
# from time import sleep
|
||||||
@ -678,7 +656,6 @@ def main(source='deamon'):
|
|||||||
rpc.disconnect()
|
rpc.disconnect()
|
||||||
clear()
|
clear()
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
elif source == 'menu':
|
elif source == 'menu':
|
||||||
appendLog(f'Waiting for any input')
|
appendLog(f'Waiting for any input')
|
||||||
|
|
||||||
@ -688,7 +665,6 @@ def main(source='deamon'):
|
|||||||
clear()
|
clear()
|
||||||
setTitle("AutoZoom (Главная)", sysname)
|
setTitle("AutoZoom (Главная)", sysname)
|
||||||
return
|
return
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
if source == 'deamon':
|
if source == 'deamon':
|
||||||
appendLog(f'Deamon stopped, waiting for any input')
|
appendLog(f'Deamon stopped, waiting for any input')
|
||||||
@ -698,7 +674,6 @@ def main(source='deamon'):
|
|||||||
rpc.disconnect()
|
rpc.disconnect()
|
||||||
clear()
|
clear()
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
elif source == 'menu':
|
elif source == 'menu':
|
||||||
appendLog(f'Deamon stopped, waiting for any input')
|
appendLog(f'Deamon stopped, waiting for any input')
|
||||||
|
|
||||||
|
25
functions.py
25
functions.py
@ -29,24 +29,16 @@ default_config = {
|
|||||||
"telegram_enabled": False,
|
"telegram_enabled": False,
|
||||||
"use_colors": True,
|
"use_colors": True,
|
||||||
"run_fullscreen": False,
|
"run_fullscreen": False,
|
||||||
"rpc_use": True,
|
"use_rpc": True,
|
||||||
"rpc_id": "800049969960058882",
|
|
||||||
"sounds": True,
|
"sounds": True,
|
||||||
"remove_old": True,
|
"remove_old": True,
|
||||||
"end_mode": "shutdown",
|
"end_mode": "shutdown",
|
||||||
"obs_exe": None,
|
"obs_exe": None,
|
||||||
"obs_core": None,
|
"obs_core": None,
|
||||||
"obs_delay": 10,
|
|
||||||
"update_check": True,
|
"update_check": True,
|
||||||
"write_logs": True,
|
"write_logs": True,
|
||||||
"log_size": 512,
|
"log_size": 512
|
||||||
"sound_ended": "ended",
|
}
|
||||||
"sound_recordstart": "recordstart",
|
|
||||||
"sound_recordstop": "recordstop",
|
|
||||||
"sound_shutdown": "shutdown",
|
|
||||||
"sound_started": "started",
|
|
||||||
"sound_warning": "warning"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Функция возвращающая надпись Windows Only
|
# Функция возвращающая надпись Windows Only
|
||||||
@ -80,14 +72,11 @@ else:
|
|||||||
|
|
||||||
|
|
||||||
# Импортирование игралки звуков
|
# Импортирование игралки звуков
|
||||||
try:
|
if getOS() == "windows":
|
||||||
if getOS() == "windows":
|
|
||||||
import winsound
|
import winsound
|
||||||
from playsound import playsound
|
from playsound import playsound
|
||||||
elif getOS() == "unix":
|
elif getOS() == "unix":
|
||||||
from playsound import playsound
|
from playsound import playsound
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Установка заголовка окна cmd.exe
|
# Установка заголовка окна cmd.exe
|
||||||
@ -363,10 +352,6 @@ def getConfig(some_var):
|
|||||||
|
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
try:
|
|
||||||
setConfig(some_var, default_config[some_var])
|
|
||||||
return default_config[some_var]
|
|
||||||
except:
|
|
||||||
repairConfig(config_list)
|
repairConfig(config_list)
|
||||||
config_list = json.load(json_file)
|
config_list = json.load(json_file)
|
||||||
json_file.close()
|
json_file.close()
|
||||||
|
10
main.py
10
main.py
@ -9,8 +9,6 @@ import platform
|
|||||||
import subprocess
|
import subprocess
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import libinstaller
|
|
||||||
|
|
||||||
from functions import *
|
from functions import *
|
||||||
|
|
||||||
appendLog('main.py start initialized', startup=True)
|
appendLog('main.py start initialized', startup=True)
|
||||||
@ -30,13 +28,15 @@ else:
|
|||||||
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
|
BBLACK = BRED = BGREEN = BYELLOW = BBLUE = BMAGENTA = BCYAN = BWHITE = ''
|
||||||
ULINE = REVERSE = ''
|
ULINE = REVERSE = ''
|
||||||
|
|
||||||
|
import libinstaller
|
||||||
|
|
||||||
import wget
|
import wget
|
||||||
import requests
|
import requests
|
||||||
import keyboard
|
import keyboard
|
||||||
import getpass
|
import getpass
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
version = 2.6
|
version = 2.3
|
||||||
path = Path(__file__).resolve().parent
|
path = Path(__file__).resolve().parent
|
||||||
|
|
||||||
def mainMenu():
|
def mainMenu():
|
||||||
@ -237,7 +237,7 @@ def helpMenu():
|
|||||||
elif help_choose == '7':
|
elif help_choose == '7':
|
||||||
try:
|
try:
|
||||||
clear()
|
clear()
|
||||||
print(f'{BBLACK}»{RESET} Список поддержавших проект:\n\n{(requests.get("https://www.end-play.xyz/AutoZoomDonors.txt").content.decode("utf-8")).replace("-", RESET+" •"+BRED)}{RESET}')
|
print(f'{BBLACK}»{RESET} Список поддержавших проект:\n\n{(requests.get("https://www.end-play.xyz/AutoZoomDonors.txt").text).replace("-", RESET+" •"+BRED)}{RESET}')
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
clear()
|
clear()
|
||||||
appendLog(f'Failed to load donation list {exp}')
|
appendLog(f'Failed to load donation list {exp}')
|
||||||
@ -462,7 +462,7 @@ def updater(serv_ver, version):
|
|||||||
appendLog('Changelog loaded')
|
appendLog('Changelog loaded')
|
||||||
clear()
|
clear()
|
||||||
print(f'{RESET}{changelog_text}\n')
|
print(f'{RESET}{changelog_text}\n')
|
||||||
print(changelog.content.decode('utf-8'))
|
print(changelog.text)
|
||||||
print(changelog_footer)
|
print(changelog_footer)
|
||||||
none = input('\n > ')
|
none = input('\n > ')
|
||||||
continue
|
continue
|
||||||
|
259
rpc.py
259
rpc.py
@ -6,40 +6,18 @@ import sys
|
|||||||
from colors import *
|
from colors import *
|
||||||
from functions import *
|
from functions import *
|
||||||
|
|
||||||
version = '2.6'
|
version = '2.3'
|
||||||
|
|
||||||
import libinstaller
|
import libinstaller
|
||||||
from pypresence import Presence
|
from pypresence import Presence
|
||||||
|
|
||||||
client_id = getConfig("rpc_id")
|
client_id = '800049969960058882'
|
||||||
|
|
||||||
try:
|
RPC = Presence(client_id,pipe=0)
|
||||||
RPC = Presence(client_id,pipe=0)
|
|
||||||
except Exception as exp:
|
|
||||||
appendLog(f'Discord RPC failed to initialize status due to {exp}')
|
|
||||||
if getConfig("debug"):
|
|
||||||
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.\nОшибка: {BRED}{exp}{RESET}')
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
connected = False
|
connected = False
|
||||||
|
|
||||||
rpc_dict = {
|
if getConfig("use_rpc") and getOS != "android":
|
||||||
"large_image": "1024_cover",
|
|
||||||
"small_image": {
|
|
||||||
"waiting": "status_waiting",
|
|
||||||
"conference": "status_lesson",
|
|
||||||
"menu": "status_menu",
|
|
||||||
"shutdown": "status_shutdown",
|
|
||||||
"settings": "status_settings",
|
|
||||||
"debug": "status_debug",
|
|
||||||
"editor": "status_editing",
|
|
||||||
"updating": "status_updating",
|
|
||||||
"support": "status_support"
|
|
||||||
},
|
|
||||||
"large_text": "AutoZoom • v%version%\nhttp://bit.ly/auto_zoom"
|
|
||||||
}
|
|
||||||
|
|
||||||
if getConfig("rpc_use") and getOS != "android":
|
|
||||||
try:
|
try:
|
||||||
RPC.connect()
|
RPC.connect()
|
||||||
connected = True
|
connected = True
|
||||||
@ -51,7 +29,7 @@ else:
|
|||||||
def disconnect():
|
def disconnect():
|
||||||
global connected
|
global connected
|
||||||
|
|
||||||
if getConfig("rpc_use") and getOS != "android":
|
if getConfig("use_rpc") and getOS != "android":
|
||||||
try:
|
try:
|
||||||
RPC.close()
|
RPC.close()
|
||||||
connected = False
|
connected = False
|
||||||
@ -70,27 +48,19 @@ def connect():
|
|||||||
appendLog('Discord RPC failed to connect')
|
appendLog('Discord RPC failed to connect')
|
||||||
|
|
||||||
def reset():
|
def reset():
|
||||||
if getConfig("rpc_use") and getOS != "android":
|
if getConfig("use_rpc") and getOS != "android":
|
||||||
RPC.clear()
|
RPC.clear()
|
||||||
appendLog('Discord RPC status cleared')
|
appendLog('Discord RPC status cleared')
|
||||||
|
|
||||||
|
|
||||||
def changePresence(sml_img, sml_txt, stt, dtls, start=None, end=None):
|
|
||||||
|
def waitLesson(lesson, start):
|
||||||
try:
|
try:
|
||||||
if getConfig("rpc_use") and getOS != "android":
|
if getConfig("use_rpc") and getOS != "android":
|
||||||
if connected == False:
|
if connected == False:
|
||||||
connect()
|
connect()
|
||||||
RPC.update(
|
RPC.update(large_image='1024_cover', small_image='status_waiting', large_text=f'AutoZoom • v{str(version)}\nhttp://bit.ly/auto_zoom', small_text='Ожидание', state=f'Ждём начала «{lesson}»', details='Конференция не началась', start=start)
|
||||||
large_image=rpc_dict["large_image"],
|
appendLog(f'Discord RPC changed to waitLesson (Lesson: {lesson}, Start: {start})')
|
||||||
small_image=rpc_dict["small_image"][sml_img],
|
|
||||||
large_text=rpc_dict["large_text"].replace("%version%", str(version)),
|
|
||||||
small_text=sml_txt,
|
|
||||||
state=stt,
|
|
||||||
details=dtls,
|
|
||||||
start=start,
|
|
||||||
end=end
|
|
||||||
)
|
|
||||||
appendLog(f'Discord RPC changed: (Small image: {sml_img}, Small text: {sml_txt}, State: {stt}, Details: {dtls}, Start: {str(start)}, End: {str(end)})')
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
appendLog('Discord RPC failed to change status')
|
appendLog('Discord RPC failed to change status')
|
||||||
if getConfig("debug"):
|
if getConfig("debug"):
|
||||||
@ -101,46 +71,177 @@ def changePresence(sml_img, sml_txt, stt, dtls, start=None, end=None):
|
|||||||
if getConfig("debug"):
|
if getConfig("debug"):
|
||||||
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
|
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.')
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
except Exception as exp:
|
|
||||||
appendLog(f'Discord RPC failed to change status due to {exp}')
|
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{str(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"):
|
if getConfig("debug"):
|
||||||
print(f'{RESET}Модуль {BRED}Discord RPC {RESET}не смог подключиться.\nВозможно, ваш {CYAN}Discord {RESET}не открыт.\nОшибка: {BRED}{exp}{RESET}')
|
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{str(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{str(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{str(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{str(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{str(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{str(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{str(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{str(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)
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
def waitLesson(conference, start):
|
|
||||||
changePresence("waiting", "Ожидание", f"Ждём начала «{conference}»", "Конференция не началась", start=start)
|
|
||||||
|
|
||||||
def onLesson(conference, start):
|
|
||||||
changePresence("conference", "Конференция", f"Слушаем «{conference}»", "Идёт конференция", start=start)
|
|
||||||
|
|
||||||
def inMenu():
|
|
||||||
changePresence("menu", "Главное меню", "Открыт список опций", "В главном меню")
|
|
||||||
|
|
||||||
def shutdown(end):
|
|
||||||
changePresence("shutdown", "Выключение", "Отсчёт до авто-выключения", "Выключение ПК", end=end)
|
|
||||||
|
|
||||||
def sleepmode(end):
|
|
||||||
changePresence("shutdown", "Спящий режим", "Отсчёт до авто-засыпания", "Спящий режим ПК", end=end)
|
|
||||||
|
|
||||||
def inSettings():
|
|
||||||
changePresence("settings", "Настройки", "Открыты настройки", "В главном меню")
|
|
||||||
|
|
||||||
def inDebug():
|
|
||||||
changePresence("debug", "Отладка", "Открыто меню отладки", "В меню разработчика")
|
|
||||||
|
|
||||||
def inEditor():
|
|
||||||
changePresence("editor", "Редактор", "Открыт редактор", "В главном меню")
|
|
||||||
|
|
||||||
def inUpdater():
|
|
||||||
changePresence("updating", "Обновление", "Открыт центр обновлений", "В главном меню")
|
|
||||||
|
|
||||||
def inHelp():
|
|
||||||
changePresence("support", "Помощь", "Открыта помощь", "В главном меню")
|
|
||||||
|
|
||||||
def lessonEnded():
|
|
||||||
changePresence("waiting", "Ожидание", "Ждём указаний", "Все конференции закончились")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
changePresence("settings", "Отладка", "Модуль Discord RPC запущен в режиме тестирования", "Режим отладки")
|
try:
|
||||||
|
RPC.connect()
|
||||||
|
RPC.update(large_image='1024_cover', small_image='status_settings', large_text=f'AutoZoom • v{str(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)
|
||||||
|
41
settings.py
41
settings.py
@ -432,22 +432,16 @@ def settings3():
|
|||||||
print(f' {BRED}2.{RESET} Размер лога действий ({YELLOW}{str(getConfig("log_size"))} Кб{RESET})')
|
print(f' {BRED}2.{RESET} Размер лога действий ({YELLOW}{str(getConfig("log_size"))} Кб{RESET})')
|
||||||
print(f' {BBLACK}Размер файла лога превышая который он будет упакован в архив\n')
|
print(f' {BBLACK}Размер файла лога превышая который он будет упакован в архив\n')
|
||||||
|
|
||||||
print(f' {BRED}3.{RESET} Задержка до записи OBS ({YELLOW}{str(getConfig("obs_delay"))} сек.{RESET})')
|
print(f' {BRED}3.{RESET} Добавить в автозапуск')
|
||||||
print(f' {BBLACK}Через сколько секунд будет отправлен сигнал записи экрана\n')
|
|
||||||
|
|
||||||
print(f' {BRED}4.{RESET} Добавить в автозапуск')
|
|
||||||
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Автоматически запускать демона при входе в систему\n')
|
print(f' {BBLACK}{winOnly(BRED, BBLACK, sysname, end=" ")}Автоматически запускать демона при входе в систему\n')
|
||||||
|
|
||||||
print(f' {BRED}5.{RESET} Удалять старые конференции ({remove_val})')
|
print(f' {BRED}4.{RESET} Удалять старые конференции ({remove_val})')
|
||||||
print(f' {BBLACK}Автоматически удалять одноразовые конференции которые были до дня запуска\n')
|
print(f' {BBLACK}Автоматически удалять одноразовые конференции которые были до дня запуска\n')
|
||||||
|
|
||||||
print(f' {BRED}6.{RESET} Кастомизация звуков и RPC')
|
print(f' {BRED}5.{RESET} Сбросить все настройки')
|
||||||
print(f' {BBLACK}Изменить звуковые файлы и APPLICATION ID используемого Discord RPC\n')
|
|
||||||
|
|
||||||
print(f' {BRED}7.{RESET} Сбросить все настройки')
|
|
||||||
print(f' {BBLACK}Восстановить настройки по умолчанию\n')
|
print(f' {BBLACK}Восстановить настройки по умолчанию\n')
|
||||||
|
|
||||||
print(f' {BRED}8.{RESET} Назад')
|
print(f' {BRED}6.{RESET} Назад')
|
||||||
print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n')
|
print(f' {BBLACK}Вернуться на предыдущую страницу{RESET}\n')
|
||||||
|
|
||||||
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
|
print(f' {BBLACK}Для переключения параметров Вкл/Выкл просто введите номер{RESET}') #\n Если окно приложения слишком мелкое - увеличьте его или листайте это меню{RESET}')
|
||||||
@ -475,22 +469,6 @@ def settings3():
|
|||||||
|
|
||||||
if settings_choose == '3':
|
if settings_choose == '3':
|
||||||
|
|
||||||
try:
|
|
||||||
clear()
|
|
||||||
log_size_value = int(input(f'{RESET}Введите через сколько секунд отправлять сигнал записи:\n\n > {BRED}'))
|
|
||||||
setConfig("obs_delay", log_size_value)
|
|
||||||
continue
|
|
||||||
except:
|
|
||||||
clear()
|
|
||||||
print(f'{RESET}Нужно использовать целое число.')
|
|
||||||
time.sleep(2)
|
|
||||||
continue
|
|
||||||
|
|
||||||
appendLog(f'Changed option "obs_delay" to {getConfig["obs_delay"]}')
|
|
||||||
continue
|
|
||||||
|
|
||||||
if settings_choose == '4':
|
|
||||||
|
|
||||||
if sysname == "windows":
|
if sysname == "windows":
|
||||||
|
|
||||||
global swl
|
global swl
|
||||||
@ -525,16 +503,11 @@ def settings3():
|
|||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
elif settings_choose == '5':
|
elif settings_choose == '4':
|
||||||
setConfig("remove_old", not getConfig("remove_old"))
|
setConfig("remove_old", not getConfig("remove_old"))
|
||||||
appendLog(f'Changed option "remove_old" to {getConfig("remove_old")}')
|
appendLog(f'Changed option "remove_old" to {getConfig("remove_old")}')
|
||||||
|
|
||||||
elif settings_choose == '6':
|
elif settings_choose == '5':
|
||||||
appendLog('Going to customize page')
|
|
||||||
clear()
|
|
||||||
customize()
|
|
||||||
|
|
||||||
elif settings_choose == '7':
|
|
||||||
appendLog('Resetting configuration')
|
appendLog('Resetting configuration')
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
@ -568,7 +541,7 @@ def settings3():
|
|||||||
clear()
|
clear()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
elif settings_choose == '8':
|
elif settings_choose == '6':
|
||||||
appendLog('Returned to settings page 2')
|
appendLog('Returned to settings page 2')
|
||||||
clear()
|
clear()
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user