Compare commits
30 Commits
44628a3021
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 09def1cd63 | |||
| 604054af9e | |||
| d6bd061090 | |||
| e57773ccbb | |||
| 05a8039b18 | |||
| a22fb2b4b1 | |||
| 1381ddb007 | |||
| e9bec0159f | |||
| 5dc78b8cb0 | |||
| 67b3c4278b | |||
| 0497cbf9b7 | |||
| 2b9ac41ced | |||
| fc450f633e | |||
| 1070362bc6 | |||
| d2915c10e2 | |||
| ebdae6256e | |||
| 8cc68080e8 | |||
| 94275048bb | |||
| 1504e03e13 | |||
| 87424c8786 | |||
| b21b16b817 | |||
| 12ee02cee0 | |||
| ba353a3609 | |||
| 69cb179d87 | |||
| 1bd7fc2ef1 | |||
| 535087fae1 | |||
| e8a61a9e36 | |||
| 5d7f89cff0 | |||
| 763cc4d131 | |||
| bd22e8e9b6 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,4 @@
|
||||
config/*
|
||||
modules/irc-bridge/error.log
|
||||
__pycache__/
|
||||
modules/auto-schedule-pro-v2/preference-db
|
||||
|
||||
39
main.py
39
main.py
@@ -7,6 +7,7 @@ import sys
|
||||
import os
|
||||
import threading
|
||||
import importlib
|
||||
import traceback
|
||||
|
||||
# global variables
|
||||
STOP_REQUESTED = False
|
||||
@@ -38,7 +39,8 @@ class ModuleV1:
|
||||
|
||||
# set environmental variables
|
||||
def set_env(self):
|
||||
self.RESPONCE = ""
|
||||
self.RESPONSE = ""
|
||||
self.FORMAT = ""
|
||||
|
||||
def set_predefine(self):
|
||||
try:
|
||||
@@ -54,10 +56,11 @@ class ModuleV1:
|
||||
self.MESSAGE = msg
|
||||
try:
|
||||
exec(self.code)
|
||||
return self.RESPONCE
|
||||
return self.RESPONSE, self.FORMAT
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return ""
|
||||
print(f"[ERROR] module v1: traceback:\ntraceback.format_exc()")
|
||||
return "", None
|
||||
|
||||
|
||||
class ModuleV2:
|
||||
@@ -72,11 +75,11 @@ class ModuleV2:
|
||||
# running the module
|
||||
def process(self, msg):
|
||||
try:
|
||||
response = self.obj.process(msg, self.path)
|
||||
return response
|
||||
return self.obj.process(msg, self.path)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return None
|
||||
print(f"[ERROR] module v2: traceback:\ntraceback.format_exc()")
|
||||
return None, None
|
||||
|
||||
|
||||
# module control unit
|
||||
@@ -188,12 +191,21 @@ def queue_processor():
|
||||
# modules are used in here
|
||||
for mod in mcu.modules:
|
||||
if mod.enabled:
|
||||
if mod.version == 1 or mod.version == 2:
|
||||
responce = mod.process(msg)
|
||||
if responce:
|
||||
updater.bot.send_message(chat_id=msg.chat.id, text=responce,
|
||||
if mod.version in [1, 2]:
|
||||
response, formatting = mod.process(msg)
|
||||
|
||||
if response:
|
||||
if formatting == None:
|
||||
updater.bot.send_message(chat_id=msg.chat.id, text=response,
|
||||
disable_web_page_preview=True)
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {responce}")
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
break
|
||||
|
||||
elif formatting in ["Markdown", "MarkdownV2", "HTML"]:
|
||||
updater.bot.send_message(chat_id=msg.chat.id, text=response,
|
||||
disable_web_page_preview=True,
|
||||
parse_mode=formatting)
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text (using {formatting}): {response}")
|
||||
break
|
||||
|
||||
del message_queue[0]
|
||||
@@ -204,9 +216,10 @@ def queue_processor():
|
||||
break
|
||||
else:
|
||||
time.sleep(1)
|
||||
except Exception:
|
||||
except Exception as e:
|
||||
print(f"[ERROR] queue_processor: current message queue: {message_queue}")
|
||||
print("[ERROR] queue_processor: error while processing message, trying to delete it...")
|
||||
print(f"[ERROR] Traceback:\n{traceback.format_exc()}")
|
||||
print(f"[ERROR] queue_processor: error while processing message ({e}), trying to delete it...")
|
||||
try:
|
||||
del message_queue[0]
|
||||
print("[INFO] queue_processor: deleted broken message from the queue")
|
||||
|
||||
@@ -6,6 +6,7 @@ import sys
|
||||
import os
|
||||
import threading
|
||||
import importlib
|
||||
import traceback
|
||||
|
||||
from telegram import Message, Chat
|
||||
|
||||
@@ -40,6 +41,7 @@ class ModuleV1:
|
||||
# set environmental variables
|
||||
def set_env(self):
|
||||
self.RESPONSE = ""
|
||||
self.FORMAT = ""
|
||||
|
||||
def set_predefine(self):
|
||||
try:
|
||||
@@ -55,10 +57,11 @@ class ModuleV1:
|
||||
self.MESSAGE = msg
|
||||
try:
|
||||
exec(self.code)
|
||||
return self.RESPONSE
|
||||
return self.RESPONSE, self.FORMAT
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return ""
|
||||
print(f"[ERROR] module v1: traceback:\n{traceback.format_exc()}")
|
||||
return "", None
|
||||
|
||||
|
||||
class ModuleV2:
|
||||
@@ -73,11 +76,11 @@ class ModuleV2:
|
||||
# running the module
|
||||
def process(self, msg):
|
||||
try:
|
||||
responce = self.obj.process(msg, self.path)
|
||||
return responce
|
||||
return self.obj.process(msg, self.path)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return None
|
||||
print(f"[ERROR] module v2: traceback:\n{traceback.format_exc()}")
|
||||
return None, None
|
||||
|
||||
|
||||
# module control unit
|
||||
@@ -188,11 +191,16 @@ def queue_processor():
|
||||
# modules are used in here
|
||||
for mod in mcu.modules:
|
||||
if mod.enabled:
|
||||
if mod.version == 1 or mod.version == 2:
|
||||
response = mod.process(msg)
|
||||
if mod.version in [1, 2]:
|
||||
response, formatting = mod.process(msg)
|
||||
|
||||
if response:
|
||||
if formatting == None:
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
break
|
||||
elif formatting in ["Markdown", "MarkdownV2", "HTML"]:
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text (using {formatting}): {response}")
|
||||
break
|
||||
|
||||
del message_queue[0]
|
||||
else:
|
||||
@@ -203,6 +211,7 @@ def queue_processor():
|
||||
|
||||
except Exception:
|
||||
print(f"[ERROR] queue_processor: current message queue: {message_queue}")
|
||||
print(f"[ERROR] Traceback:\n{traceback.format_exc()}")
|
||||
print("[ERROR] queue_processor: error while processing message, trying to delete it...")
|
||||
try:
|
||||
del message_queue[0]
|
||||
|
||||
26
modules/auto-schedule-pro-v2/additions-v2.json
Normal file
26
modules/auto-schedule-pro-v2/additions-v2.json
Normal file
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
||||
@@ -1,15 +1,19 @@
|
||||
from datetime import datetime
|
||||
import json
|
||||
|
||||
import os
|
||||
|
||||
def readfile(filename):
|
||||
with open(module_path + filename) as f:
|
||||
return f.read()
|
||||
|
||||
def writefile(filename, data):
|
||||
with open(module_path + filename, 'w') as f:
|
||||
f.write(data)
|
||||
|
||||
# global constants
|
||||
# Accusative - znahidnyj
|
||||
WEEKDAYS_ACCUSATIVE = ["понеділок", "вівторок", "середу", "четвер", "п'ятницю", "суботу", "неділю"]
|
||||
|
||||
# Genitive - rodovyj
|
||||
WEEKDAYS_GENITIVE_NEXT = ["наступного понеділка", "наступного вівторка", "наступної середи", "наступного четверга",
|
||||
"наступної п'ятниці", "наступної суботи", "наступної неділі"]
|
||||
@@ -17,9 +21,119 @@ WEEKDAYS_GENITIVE_NEXT = ["наступного понеділка", "насту
|
||||
WEEKDAYS_GENITIVE_THIS = ["цього понеділка", "цього вівторка", "цієї середи", "цього четверга", "цієї п'ятниці",
|
||||
"цієї суботи", "цієї неділі"]
|
||||
|
||||
lesson_types_to_strings = {
|
||||
"lec": "лекція",
|
||||
"prac": "практика",
|
||||
"lab": "лабораторна"
|
||||
}
|
||||
|
||||
|
||||
# global variables
|
||||
module_path = ""
|
||||
|
||||
def get_preference_by_id(user_id, name):
|
||||
if not os.path.exists(module_path + f"preference-db/{user_id}.json"):
|
||||
return None
|
||||
|
||||
raw_prefs = readfile(f"preference-db/{user_id}.json")
|
||||
try:
|
||||
preferences = json.loads(raw_prefs)
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
if not name in preferences:
|
||||
return None
|
||||
|
||||
return preferences[name]
|
||||
|
||||
|
||||
def get_all_preferences_by_id(user_id):
|
||||
user_preferences = {
|
||||
"output-style": "legacy-vibrant",
|
||||
"output-style-lesson": "None",
|
||||
"output-style-lookup": "None"
|
||||
}
|
||||
|
||||
# label defaults as defaults and let custom settings override these labels
|
||||
for i in user_preferences:
|
||||
user_preferences[i] += " <i>(default)</i>"
|
||||
|
||||
for i in user_preferences:
|
||||
override = get_preference_by_id(user_id, i)
|
||||
if override != None:
|
||||
user_preferences[i] = override
|
||||
|
||||
return user_preferences
|
||||
|
||||
|
||||
def set_preference_by_id(user_id, name, value):
|
||||
if not os.path.exists(module_path + "preference-db/"):
|
||||
os.mkdir(module_path + "preference-db/")
|
||||
|
||||
preferences = {}
|
||||
|
||||
if os.path.exists(module_path + f"preference-db/{user_id}.json"):
|
||||
try:
|
||||
raw_prefs = readfile(f"preference-db/{user_id}.json")
|
||||
preferences = json.loads(raw_prefs)
|
||||
except Exception as e:
|
||||
preferences = {}
|
||||
else:
|
||||
preferences = {}
|
||||
|
||||
preferences[name] = value
|
||||
|
||||
final_data = json.dumps(preferences)
|
||||
writefile(f"preference-db/{user_id}.json", final_data)
|
||||
|
||||
|
||||
def clear_preference_by_id(user_id, name):
|
||||
if not os.path.exists(module_path + "preference-db/"):
|
||||
os.mkdir(module_path + "preference-db/")
|
||||
|
||||
preferences = {}
|
||||
|
||||
if os.path.exists(module_path + f"preference-db/{user_id}.json"):
|
||||
try:
|
||||
raw_prefs = readfile(f"preference-db/{user_id}.json")
|
||||
preferences = json.loads(raw_prefs)
|
||||
except Exception as e:
|
||||
preferences = {}
|
||||
else:
|
||||
preferences = {}
|
||||
|
||||
if name in preferences:
|
||||
del preferences[name]
|
||||
|
||||
final_data = json.dumps(preferences)
|
||||
writefile(f"preference-db/{user_id}.json", final_data)
|
||||
|
||||
|
||||
def load_template(template, part):
|
||||
return readfile(f"templates/{template}/{part}.msg")
|
||||
|
||||
|
||||
def escaped_string_markdownV2(input_string):
|
||||
result_string = input_string
|
||||
|
||||
symbols_to_escape = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
|
||||
|
||||
for symbol in symbols_to_escape:
|
||||
result_string = result_string.replace(symbol, f"\\{symbol}")
|
||||
|
||||
return result_string
|
||||
|
||||
|
||||
def escaped_string_html(input_string):
|
||||
result_string = input_string
|
||||
|
||||
symbols_to_escape = ['<', '>']
|
||||
|
||||
for symbol in symbols_to_escape:
|
||||
result_string = result_string.replace(symbol, f"\\{symbol}")
|
||||
|
||||
return result_string
|
||||
|
||||
|
||||
def get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week):
|
||||
@@ -43,27 +157,69 @@ def get_human_readable_date(start_datetime, end_datetime,
|
||||
return human_readable_date
|
||||
|
||||
|
||||
def generate_lesson_description(lesson, start_datetime, end_datetime, current_day, current_week, overrides={}):
|
||||
output_settings = {"name": True, "date": True, "teacher": True, "link": True}
|
||||
output_settings.update(overrides)
|
||||
def get_name_of_lesson_type(lesson_type):
|
||||
if lesson_type in lesson_types_to_strings:
|
||||
return lesson_types_to_strings[lesson_type]
|
||||
|
||||
result = ""
|
||||
|
||||
if output_settings['name']:
|
||||
result += f"{lesson['name']}\n"
|
||||
def generate_lesson_description(lesson, start_datetime, end_datetime, current_day, current_week, overrides={},
|
||||
custom_name_prefix="Назва", template="legacy-vibrant", force_date_at_top=False):
|
||||
# temporarily not supported
|
||||
#output_settings = {"name": True, "date": True, "teacher": True, "link": True, "comment": True}
|
||||
#output_settings.update(overrides)
|
||||
|
||||
if output_settings['date']:
|
||||
if lesson.__class__ == dict:
|
||||
if force_date_at_top:
|
||||
total_result = load_template(template, "date")
|
||||
human_readable_date = get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week)
|
||||
result += f"Дата: {human_readable_date}\n"
|
||||
total_result = total_result.replace("%DATE%", human_readable_date)
|
||||
|
||||
if output_settings['teacher']:
|
||||
result += f"Викладач: {lesson['teacher']}\n"
|
||||
total_result += load_template(template, "multiple")
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
total_result = total_result.replace(f"%{i.upper()}%", lesson[i])
|
||||
|
||||
if output_settings['link']:
|
||||
result += f"Посилання на пару: {lesson['link']}"
|
||||
total_result = total_result.replace("%DATE%", human_readable_date)
|
||||
total_result = total_result.replace("%TYPE%", get_name_of_lesson_type(lesson['type']))
|
||||
total_result = total_result.replace("%NAME_PREFIX%", custom_name_prefix)
|
||||
|
||||
return result
|
||||
return total_result + "\n"
|
||||
|
||||
else:
|
||||
active_template = load_template(template, "single")
|
||||
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
active_template = active_template.replace(f"%{i.upper()}%", lesson[i])
|
||||
|
||||
|
||||
human_readable_date = get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week)
|
||||
|
||||
active_template = active_template.replace("%DATE%", human_readable_date)
|
||||
active_template = active_template.replace("%TYPE%", get_name_of_lesson_type(lesson['type']))
|
||||
active_template = active_template.replace("%NAME_PREFIX%", custom_name_prefix)
|
||||
|
||||
return active_template
|
||||
|
||||
elif lesson.__class__ == list:
|
||||
total_result = load_template(template, "date")
|
||||
human_readable_date = get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week)
|
||||
total_result = total_result.replace("%DATE%", human_readable_date)
|
||||
|
||||
for l in lesson:
|
||||
active_template = load_template(template, "multiple")
|
||||
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
active_template = active_template.replace(f"%{i.upper()}%", l[i])
|
||||
|
||||
active_template = active_template.replace("%DATE%", human_readable_date)
|
||||
active_template = active_template.replace("%TYPE%", get_name_of_lesson_type(l['type']))
|
||||
active_template = active_template.replace("%NAME_PREFIX%", custom_name_prefix)
|
||||
|
||||
total_result += active_template + "\n"
|
||||
|
||||
return total_result
|
||||
|
||||
|
||||
def get_schedule_data_from(filename):
|
||||
@@ -76,8 +232,15 @@ def get_schedule_data_from(filename):
|
||||
timestamp = day_number * 86400 + int(lesson_time.split(":")[0]) * 3600 \
|
||||
+ int(lesson_time.split(":")[1]) * 60
|
||||
|
||||
new_record = dict(raw_schedule[day_number][lesson_time])
|
||||
new_record["source"] = filename.split(".json")[0]
|
||||
new_record = raw_schedule[day_number][lesson_time]
|
||||
item_source = filename.split(".json")[0]
|
||||
|
||||
if new_record.__class__ == list:
|
||||
for item in new_record:
|
||||
item["source"] = item_source
|
||||
else:
|
||||
new_record["source"] = item_source
|
||||
|
||||
baked_schedule[timestamp] = new_record
|
||||
|
||||
return baked_schedule
|
||||
@@ -105,14 +268,16 @@ def process_arguments(args, base_day):
|
||||
return preferences, selected_day
|
||||
|
||||
|
||||
def get_lesson_description(schedule, reference_time, lesson_time, current_day, current_week, overrides={}):
|
||||
def get_lesson_description(schedule, reference_time, lesson_time, current_day, current_week, overrides={},
|
||||
custom_name_prefix="Назва", template="legacy-vibrant", force_date_at_top=False):
|
||||
lesson_record = schedule[lesson_time]
|
||||
|
||||
lesson_start_datetime = datetime.fromtimestamp(reference_time + lesson_time)
|
||||
lesson_end_datetime = datetime.fromtimestamp(reference_time + lesson_time + 5400)
|
||||
|
||||
return generate_lesson_description(lesson_record, lesson_start_datetime, lesson_end_datetime, current_day,
|
||||
current_week, overrides=overrides)
|
||||
current_week, overrides=overrides, custom_name_prefix=custom_name_prefix, template=template,
|
||||
force_date_at_top=force_date_at_top)
|
||||
|
||||
|
||||
def process(message, path):
|
||||
@@ -124,14 +289,14 @@ def process(message, path):
|
||||
# one printable symbol, so this is already protected
|
||||
base_command = full_command[0].lower()
|
||||
|
||||
if base_command not in ["!пара", "!пари"]:
|
||||
return ""
|
||||
if base_command not in ["!пара", "!пари", "!schedule-ctl"]:
|
||||
return None, None
|
||||
|
||||
global module_path
|
||||
module_path = path
|
||||
|
||||
schedule = get_schedule_data_from("schedule.json")
|
||||
schedule.update(get_schedule_data_from("additions.json"))
|
||||
schedule = get_schedule_data_from("schedule-v2.json")
|
||||
schedule.update(get_schedule_data_from("additions-v2.json"))
|
||||
|
||||
current_time = datetime.now()
|
||||
|
||||
@@ -144,6 +309,18 @@ def process(message, path):
|
||||
reference_time = int(current_time.strftime("%s")) - current_seconds
|
||||
|
||||
if base_command == "!пара":
|
||||
# easter egg
|
||||
study_begin_ts = int(datetime(year=2023, month=9, day=4).strftime("%s"))
|
||||
current_ts = int(datetime.now().strftime("%s"))
|
||||
|
||||
if -3600*4 < study_begin_ts - current_ts < 0:
|
||||
return "Навчання от-от розпочнеться!", None
|
||||
elif 0 <= study_begin_ts - current_ts < 1209600:
|
||||
return f"До навчання залишилося {study_begin_ts - current_ts} секунд...", None
|
||||
elif study_begin_ts - current_ts >= 1209600:
|
||||
return "Ви маєте законне право відпочити, пари почнуться не скоро", None
|
||||
|
||||
# actual lesson finding code
|
||||
upcoming_lessons = [timestamp for timestamp in schedule if timestamp > current_seconds - 5400]
|
||||
|
||||
if len(upcoming_lessons) > 0:
|
||||
@@ -151,8 +328,34 @@ def process(message, path):
|
||||
else:
|
||||
closest_lesson_time = min(schedule)
|
||||
|
||||
return "Актуальна пара: " + get_lesson_description(schedule, reference_time, closest_lesson_time, current_day,
|
||||
current_week)
|
||||
# shifting lesson pointer if requested to do so
|
||||
if len(full_command) >= 2:
|
||||
possible_times = list(schedule.keys())
|
||||
current_pointer_position = possible_times.index(closest_lesson_time)
|
||||
total_list_length = len(possible_times)
|
||||
|
||||
if len(full_command[1]) > 1 and full_command[1][1:].isdigit():
|
||||
if full_command[1][0] == "+":
|
||||
current_pointer_position = (current_pointer_position + int(full_command[1][1:])) % total_list_length
|
||||
else:
|
||||
current_pointer_position = (current_pointer_position - int(full_command[1][1:])) % total_list_length
|
||||
|
||||
closest_lesson_time = possible_times[current_pointer_position]
|
||||
|
||||
# getting corrent style
|
||||
output_style_preference = "legacy-vibrant"
|
||||
|
||||
general_output_style_preference = get_preference_by_id(message.from_user.id, "output-style")
|
||||
if general_output_style_preference != None:
|
||||
output_style_preference = general_output_style_preference
|
||||
|
||||
specific_output_style_preference = get_preference_by_id(message.from_user.id, "output-style-lesson")
|
||||
if specific_output_style_preference != None:
|
||||
output_style_preference = specific_output_style_preference
|
||||
|
||||
# returning generated pair description
|
||||
return get_lesson_description(schedule, reference_time, closest_lesson_time, current_day,
|
||||
current_week, custom_name_prefix="Актуальна пара", template=output_style_preference), "HTML"
|
||||
|
||||
elif base_command == "!пари":
|
||||
base_day = current_week * 7 + current_day
|
||||
@@ -166,8 +369,52 @@ def process(message, path):
|
||||
|
||||
lesson_list = [i for i in schedule if selected_day * 86400 <= i < (selected_day + 1) * 86400]
|
||||
|
||||
lesson_descriptions_list = ["Назва: " + get_lesson_description(schedule, reference_time, lesson_time,
|
||||
current_day, current_week, overrides=preferences)
|
||||
output_style_preference = "legacy-vibrant"
|
||||
|
||||
general_output_style_preference = get_preference_by_id(message.from_user.id, "output-style")
|
||||
if general_output_style_preference != None:
|
||||
output_style_preference = general_output_style_preference
|
||||
|
||||
specific_output_style_preference = get_preference_by_id(message.from_user.id, "output-style-lookup")
|
||||
if specific_output_style_preference != None:
|
||||
output_style_preference = specific_output_style_preference
|
||||
|
||||
lesson_descriptions_list = [get_lesson_description(schedule, reference_time, lesson_time, current_day,
|
||||
current_week, overrides=preferences, custom_name_prefix="Назва", template=output_style_preference, force_date_at_top=True)
|
||||
for lesson_time in lesson_list]
|
||||
|
||||
return f"Пари у {WEEKDAYS_ACCUSATIVE[selected_day % 7]}:\n" + "\n\n".join(lesson_descriptions_list)
|
||||
return f"<b><u>Пари у {WEEKDAYS_ACCUSATIVE[selected_day % 7]}</u></b>:\n\n\n" + "\n".join(lesson_descriptions_list), "HTML"
|
||||
|
||||
elif base_command == "!schedule-ctl" and len(full_command) >= 2:
|
||||
if full_command[1] == "list":
|
||||
prefs = get_all_preferences_by_id(message.from_user.id)
|
||||
return "Ваші персональні налаштування:\n" + '\n'.join([f"- {k} = {v}" for k, v in prefs.items()]), "HTML"
|
||||
|
||||
elif full_command[1] == "set" and len(full_command) == 4:
|
||||
prefs = get_all_preferences_by_id(message.from_user.id)
|
||||
|
||||
if full_command[2] in prefs:
|
||||
if full_command[2] in ["output-style", "output-style-lesson", "output-style-lookup"]:
|
||||
if full_command[3] not in os.listdir(module_path + "templates/"):
|
||||
return f"Стилю {full_command[3]} не існує; доступні варіанти: " \
|
||||
+ ', '.join(os.listdir(module_path + "templates/")), "HTML"
|
||||
|
||||
previous_value = prefs[full_command[2]]
|
||||
prefs[full_command[2]] = full_command[3]
|
||||
|
||||
set_preference_by_id(message.from_user.id, full_command[2], full_command[3])
|
||||
|
||||
return f"Змінено значення {full_command[2]}: {previous_value} -> {full_command[3]}", "HTML"
|
||||
else:
|
||||
return f"Такого налаштування не існує; переглянути наявні налаштування можна за допомогою команди <u>!schedule-ctl list</u>", "HTML"
|
||||
|
||||
elif full_command[1] == "get" and len(full_command) == 3:
|
||||
requested_preference = get_preference_by_id(message.from_user.id, full_command[2])
|
||||
return f"Налаштування {full_command[2]} має значення {requested_preference}", "HTML"
|
||||
|
||||
elif full_command[1] == "clear" and len(full_command) == 3:
|
||||
clear_preference_by_id(message.from_user.id, full_command[2])
|
||||
return f"Очищено значення для налаштування {full_command[2]}, надалі для нього використовуватиметься стандартне значення", "HTML"
|
||||
|
||||
else:
|
||||
return "Такої команди не існує (або був використаний помилковий синтаксис)", "HTML"
|
||||
|
||||
286
modules/auto-schedule-pro-v2/schedule-v2.json
Normal file
286
modules/auto-schedule-pro-v2/schedule-v2.json
Normal file
@@ -0,0 +1,286 @@
|
||||
[
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Політична наука: конфліктологічний підхід",
|
||||
"teacher": "Багінський Андрій Владиславович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
|
||||
"10:25": [
|
||||
{
|
||||
"name": "Захист персональних даних: стандарти ЄС та Ради Європи",
|
||||
"teacher": "Дубняк М. В.",
|
||||
"link": "https://us04web.zoom.us/j/7423381732?pwd=c1pJclU2ZDRUWDgyUE10dmhJUDhiZz09",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Психологія",
|
||||
"teacher": "Волянюк Н. Ю.",
|
||||
"link": "https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT0",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Психологія конфлікту",
|
||||
"teacher": "Москаленко О. В.",
|
||||
"link": "https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"14:15": {
|
||||
"name": "Основи електронного урядування",
|
||||
"teacher": "Чукут Світлана Анатоліївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"12:20": {
|
||||
"name": "Інженерія програмного забезпечення",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "https://zoom.us/wc/88696149166/join?from=join&_x_zm_rtaid=qhdJKhYLQNakh-zwxMG4lg.1693903841334.ad606145c892a54a4b450526e2394cbe&_x_zm_rhtaid=531",
|
||||
"type": "lab",
|
||||
"selectable": false,
|
||||
"notice": "Код: 4VHkdw"
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Теорія електричних кіл та сигналів",
|
||||
"teacher": "Лободзинський В. Ю. & Ілліна О. О.",
|
||||
"link": "https://meet.google.com/gwx-sshq-sqb",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Теорія ймовірності та математична статистика",
|
||||
"teacher": "Марковський Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Вступ до операційної системи Linux",
|
||||
"teacher": "Роковий Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-knq-z9h-pyl",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Інженерія програмного забезпечення",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення",
|
||||
"teacher": "Стаматієва Вікторія В'ячеславівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Практичний курс іноземної мови. Частина 2",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": {
|
||||
"name": "Соціальна психологія",
|
||||
"teacher": "Блохіна Ірина Олександрівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
"16:10": {
|
||||
"name": "Основи електронного урядування",
|
||||
"teacher": "Чукут Світлана Анатоліївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Вступ до філософії",
|
||||
"teacher": "Руденко Тамара Петрівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"10:25": {
|
||||
"name": "Теорія електричних кіл та сигналів",
|
||||
"teacher": "Лободзинський Вадим Юрійович",
|
||||
"link": "https://meet.google.com/gwx-sshq-sqb",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення",
|
||||
"teacher": "Овчар Раїса Федорівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"10:25": [
|
||||
{
|
||||
"name": "Психологія",
|
||||
"teacher": "Сербова О. В.",
|
||||
"link": "https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Психологія конфлікту",
|
||||
"teacher": "Кононець М. О.",
|
||||
"link": "https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Політична наука: конфліктологічний підхід",
|
||||
"teacher": "Северинчик О. П.",
|
||||
"link": "https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Захист персональних даних: стандарти ЄС та Ради Європи",
|
||||
"teacher": "Самчинська О. А.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"14:15": {
|
||||
"name": "Розумні міста",
|
||||
"teacher": "Чукут Світлана Анатоліївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Вступ до філософії",
|
||||
"teacher": "Руденко Тамара Петрівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": {
|
||||
"name": "Теорія ймовірності та математична статистика",
|
||||
"teacher": "Марковський Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Теорія ймовірності та математична статистика",
|
||||
"teacher": "Марковський Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"10:25": {
|
||||
"name": "Вступ до операційної системи Linux",
|
||||
"teacher": "Роковий Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-knq-z9h-pyl",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Інженерія програмного забезпечення",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": {
|
||||
"name": "Інженерія програмного забезпечення",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Вступ до операційної системи Linux",
|
||||
"teacher": "Алєнін Олег Ігорович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
},
|
||||
"10:25": {
|
||||
"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення",
|
||||
"teacher": "Стаматієва Вікторія В'ячеславівна",
|
||||
"link": "(старе посилання!) https://us04web.zoom.us/j/2313886209?pwd=dnZHanV3cU9LUXJBVWYyYVArUFg5dz09",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Практичний курс іноземної мови. Частина 2",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": [
|
||||
{
|
||||
"name": "Соціальна психологія",
|
||||
"teacher": "Винославська О. В.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Розумні міста",
|
||||
"teacher": "Чукут С. А.",
|
||||
"link": "(посилання відсутні!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Теорія електричних кіл та сигналів",
|
||||
"teacher": "Лободзинський Вадим Юрійович",
|
||||
"link": "https://meet.google.com/gwx-sshq-sqb",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"12:20": {
|
||||
"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення",
|
||||
"teacher": "Овчар Раїса Федорівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
<b><u>%DATE%</u></b>:
|
||||
@@ -0,0 +1,3 @@
|
||||
<b>%NAME_PREFIX%</b>: %NAME% (%TYPE%)
|
||||
<b>Викладач</b>: %TEACHER%
|
||||
<b>Посилання</b>: %LINK%
|
||||
@@ -0,0 +1,4 @@
|
||||
<b>%NAME_PREFIX%</b>: %NAME% (%TYPE%)
|
||||
<b>Дата</b>: %DATE%
|
||||
<b>Викладач</b>: %TEACHER%
|
||||
<b>Посилання</b>: %LINK%
|
||||
1
modules/auto-schedule-pro-v2/templates/legacy/date.msg
Normal file
1
modules/auto-schedule-pro-v2/templates/legacy/date.msg
Normal file
@@ -0,0 +1 @@
|
||||
<u>%DATE%</u>:
|
||||
@@ -0,0 +1,3 @@
|
||||
%NAME_PREFIX%: %NAME% (%TYPE%)
|
||||
Викладач: %TEACHER%
|
||||
Посилання: %LINK%
|
||||
4
modules/auto-schedule-pro-v2/templates/legacy/single.msg
Normal file
4
modules/auto-schedule-pro-v2/templates/legacy/single.msg
Normal file
@@ -0,0 +1,4 @@
|
||||
%NAME_PREFIX%: %NAME% (%TYPE%)
|
||||
Дата: %DATE%
|
||||
Викладач: %TEACHER%
|
||||
Посилання: %LINK%
|
||||
1
modules/auto-schedule-pro-v2/templates/modern/date.msg
Normal file
1
modules/auto-schedule-pro-v2/templates/modern/date.msg
Normal file
@@ -0,0 +1 @@
|
||||
<b><u>%DATE%</u></b>:
|
||||
@@ -0,0 +1,3 @@
|
||||
<b>%NAME%</b> (%TYPE%)
|
||||
<i>Викладач</i>: %TEACHER%
|
||||
<i>Посилання</i>: %LINK%
|
||||
4
modules/auto-schedule-pro-v2/templates/modern/single.msg
Normal file
4
modules/auto-schedule-pro-v2/templates/modern/single.msg
Normal file
@@ -0,0 +1,4 @@
|
||||
<b>%NAME%</b> (%TYPE%)
|
||||
<i>Дата</i>: %DATE%
|
||||
<i>Викладач</i>: %TEACHER%
|
||||
<i>Посилання</i>: %LINK%
|
||||
@@ -1,6 +1,5 @@
|
||||
[
|
||||
{
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення", "teacher": "Кушлаба М. П.", "link": "https://bbb.comsys.kpi.ua/b/myk-0iw-red-p01"}
|
||||
},
|
||||
{
|
||||
},
|
||||
|
||||
@@ -1,52 +1,55 @@
|
||||
[
|
||||
{
|
||||
"8:30": {"name": "Дискретна математика (лекція)", "teacher": "Новотарський М. А.", "link": "https://us02web.zoom.us/j/87578307057?pwd=UGwyVGlwc3M4Q0Q0Q0NLWUt6bmVpUT09"},
|
||||
"10:25": {"name": "Комп'ютерна логіка (лекція)", "teacher": "Жабін В. І.", "link": "https://bbb.comsys.kpi.ua/b/val-2vb-o7w-y5y АБО https://bbb.ugrid.org/b/val-osi-lup-ou8"},
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення (лекція)", "teacher": "Онуфрієнко О. П.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"8:30": {"name": "Політична наука: конфліктологічний підхід (лекція)", "teacher": "Багінський Андрій Владиславович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Захист персональних даних: стандарти ЄС та Ради Європи & Психологія & Психологія конфлікту (лекції/практики)", "teacher": "Дубняк М. В. & Волянюк Н. Ю. & Москаленко О. В.", "link": "https://us04web.zoom.us/j/7423381732?pwd=c1pJclU2ZDRUWDgyUE10dmhJUDhiZz09 & https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09 & https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09"},
|
||||
"14:15": {"name": "Основи електронного урядування (лекція)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"12:20": {"name": "Англійська мова I (практика)", "teacher": "Шевченко О. М.", "link": "https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Фізика (лабораторна)", "teacher": "Федотов В. В. & Іванова І. М.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лабораторна)", "teacher": "Васильєва Марія Давидівна", "link": "https://zoom.us/wc/88696149166/join?from=join&_x_zm_rtaid=qhdJKhYLQNakh-zwxMG4lg.1693903841334.ad606145c892a54a4b450526e2394cbe&_x_zm_rhtaid=531"},
|
||||
"14:15": {"name": "Теорія електричних кіл та сигналів (лабораторна)", "teacher": "Лободзинський В. Ю. & Ілліна О. О.", "link": "https://meet.google.com/gwx-sshq-sqb"}
|
||||
},
|
||||
{
|
||||
"8:30": {"name": "Програмування II. Об'єктно-орієнтоване програмування (лабораторна)", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"},
|
||||
"10:25": {"name": "Вища математика (практика)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"8:30": {"name": "Теорія ймовірності та математична статистика (лекція)", "teacher": "Марковський Олександр Петрович", "link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc"},
|
||||
"10:25": {"name": "Вступ до операційної системи Linux (лекція)", "teacher": "Роковий Олександр Петрович", "link": "https://bbb.comsys.kpi.ua/b/ole-knq-z9h-pyl"},
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика (лекція)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Фізика (лекція)", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"14:15": {"name": "Програмування II. Об'єктно-орієнтоване програмування (лекція)", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"}
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "(посилання відсутнє!)"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Соціальна психологія (практика)", "teacher": "Блохіна Ірина Олександрівна", "link": "(посилання відсутнє!)"},
|
||||
"16:10": {"name": "Основи електронного урядування (практика)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Фізика (практика)", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"12:20": {"name": "Дискретна математика (лабораторна)", "teacher": "Пономаренко А. М.", "link": "https://us05web.zoom.us/j/7089075754?pwd=TWRlZmxyVlFiTWU1UGlVVU1XcFE0Zz09"},
|
||||
"14:15": {"name": "Основи здорового способу життя (практика)", "teacher": "Соболенко А. І.", "link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09"}
|
||||
"8:30": {"name": "Вступ до філософії (лекція)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"8:30": {"name": "Дискретна математика (лекція)", "teacher": "Новотарський М. А.", "link": "https://us02web.zoom.us/j/87578307057?pwd=UGwyVGlwc3M4Q0Q0Q0NLWUt6bmVpUT09"},
|
||||
"10:25": {"name": "Комп'ютерна логіка (лекція)", "teacher": "Жабін В. І.", "link": "https://bbb.comsys.kpi.ua/b/val-2vb-o7w-y5y АБО https://bbb.ugrid.org/b/val-osi-lup-ou8"},
|
||||
"12:20": {"name": "Вища математика (лекція)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"10:25": {"name": "Психологія & Психологія конфлікту (практики)", "teacher": "Сербова О. В. & Кононець М. О.", "link": "https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09 & https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09"},
|
||||
"12:20": {"name": "Політична наука: конфліктологічний підхід & Захист персональних даних: стандарти ЄС та Ради Європи (практики)", "teacher": "Северинчик О. П. & Самчинська О. А.", "link": "https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09 & (посилання відсутнє!)"},
|
||||
"14:15": {"name": "Розумні міста (лекція)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"8:30": {"name": "Комп'ютерна логіка (лабораторна)", "teacher": "Верба О. А.", "link": "https://us04web.zoom.us/j/7382214783?pwd=RnZ3SWgwK1JoVkZtNndnKzdPZjFGdz09"},
|
||||
"10:25": {"name": "Вища математика (практика)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Англійська мова I (практика)", "teacher": "Шевченко О. М.", "link": "https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Фізика (лабораторна)", "teacher": "Федотов В. В. & Іванова І. М.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"10:25": {"name": "Вступ до філософії (практика)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"14:15": {"name": "Теорія ймовірності та математична статистика (практика)", "teacher": "Марковський Олександр Петрович", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика (практика)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"8:30": {"name": "Теорія ймовірності та математична статистика (лекція)", "teacher": "Марковський Олександр Петрович", "link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc"},
|
||||
"10:25": {"name": "Вступ до операційної системи Linux (лекція)", "teacher": "Роковий Олександр Петрович", "link": "https://bbb.comsys.kpi.ua/b/ole-knq-z9h-pyl"},
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"},
|
||||
"14:15": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика (лекція)", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Фізика (лекція)", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"14:15": {"name": "Програмування II. Об'єктно-орієнтоване програмування (лекція)", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"}
|
||||
"8:30": {"name": "Вступ до операційної системи Linux (лабораторна)", "teacher": "Алєнін Олег Ігорович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "(старе посилання!) https://us04web.zoom.us/j/2313886209?pwd=dnZHanV3cU9LUXJBVWYyYVArUFg5dz09"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Соціальна психологія (лекція) & Розумні міста (практика)", "teacher": "Винославська О. В. & Чукут С. А.", "link": "(посилання відсутні!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Фізика (практика)", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення (практика)", "teacher": "Кушлаба М. П.", "link": "https://bbb.comsys.kpi.ua/b/myk-0iw-red-p01"},
|
||||
"14:15": {"name": "Основи здорового способу життя (практика)", "teacher": "Соболенко А. І.", "link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09"}
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import datetime
|
||||
import json
|
||||
import time
|
||||
import os
|
||||
|
||||
current_time = datetime.datetime.now()
|
||||
@@ -84,7 +85,7 @@ if next_pair_time == None:
|
||||
#print("test3.1.5")
|
||||
if 'container_id' in p:
|
||||
try:
|
||||
cont = json.decode(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
cont = json.loads(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
if (time.time() - cont['update_ts']) > 43200:
|
||||
if ("QUERY_STRING" in os.environ) and ("force" in os.environ['QUERY_STRING'].lower()):
|
||||
print(f"Location: {cont['link']}\n\n", end = '')
|
||||
@@ -102,7 +103,7 @@ if next_pair_time == None:
|
||||
new_seed = os.environ['REMOTE_ADDR'] + datetime.datetime.now().replace(minute = 0, second = 0).strftime("%s")
|
||||
random.seed(new_seed)
|
||||
surprise_pool = ["Йой!", "От халепа!", "Ой лишенько!"]
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p>")
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p><p>(технічна інформація про помилку: {e}</p>")
|
||||
|
||||
else:
|
||||
print(f"Location: {p['link'].split()[0]}\n\n", end = '')
|
||||
@@ -139,7 +140,7 @@ else:
|
||||
|
||||
if 'container_id' in p:
|
||||
try:
|
||||
cont = json.decode(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
cont = json.loads(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
if (time.time() - cont['update_ts']) > 43200:
|
||||
if ("QUERY_STRING" in os.environ) and ("force" in os.environ['QUERY_STRING'].lower()):
|
||||
print(f"Location: {cont['link']}\n\n", end = '')
|
||||
@@ -157,7 +158,7 @@ else:
|
||||
new_seed = os.environ['REMOTE_ADDR'] + datetime.datetime.now().replace(minute = 0, second = 0).strftime("%s")
|
||||
random.seed(new_seed)
|
||||
surprise_pool = ["Йой!", "От халепа!", "Ой лишенько!"]
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p>")
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p><p>(технічна інформація про помилку: {e}</p>")
|
||||
|
||||
else:
|
||||
print(f"Location: {p['link'].split()[0]}\n\n", end = '')
|
||||
|
||||
@@ -13,4 +13,6 @@ def get_num():
|
||||
|
||||
def process(message, path):
|
||||
if message.text == "!v2-testing":
|
||||
return f"Testing successful - call number {get_num()}"
|
||||
return f"Testing successful - call number {get_num()}", None
|
||||
else:
|
||||
return None, None
|
||||
|
||||
34
modules/translator/index.py
Normal file
34
modules/translator/index.py
Normal file
@@ -0,0 +1,34 @@
|
||||
command = self.MESSAGE['text'].split(" ", 2)
|
||||
command_length = len(command)
|
||||
|
||||
if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
try:
|
||||
import requests
|
||||
|
||||
if command_length == 1:
|
||||
chosen_model = "auto-uk"
|
||||
else:
|
||||
chosen_model = command[1]
|
||||
|
||||
source, target = chosen_model.split("-")
|
||||
|
||||
if command_length == 3:
|
||||
text_to_translate = command[2]
|
||||
else:
|
||||
text_to_translate = self.MESSAGE['reply_to_message']['text']
|
||||
|
||||
data = {"q": text_to_translate,
|
||||
"source": source,
|
||||
"target": target,
|
||||
"format": "text"}
|
||||
|
||||
res = requests.post("http://127.0.0.1:5000/translate", data = data)
|
||||
result = json.loads(res.text)
|
||||
|
||||
if source == "auto":
|
||||
self.RESPONSE = f"Результат ({result['detectedLanguage']['language']} - {result['detectedLanguage']['confidence']}%): {result['translatedText']}"
|
||||
else:
|
||||
self.RESPONSE = f"Результат: {result['translatedText']}"
|
||||
|
||||
except Exception as e:
|
||||
print(f"[translit-decoder] Got exception: {e}")
|
||||
7
modules/translator/meta.json
Normal file
7
modules/translator/meta.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 1,
|
||||
"index_file": "index.py",
|
||||
"start_on_boot": true,
|
||||
"alias": "translator",
|
||||
"predefine": "predefine.py"
|
||||
}
|
||||
1
modules/translator/predefine.py
Normal file
1
modules/translator/predefine.py
Normal file
@@ -0,0 +1 @@
|
||||
self.aliases = ["!translate", "!t"]
|
||||
@@ -1,8 +1,15 @@
|
||||
command = self.MESSAGE['text'].split(" ", 2)
|
||||
command_length = len(command)
|
||||
|
||||
def escaped_string(unescaped_string):
|
||||
result_string = str(unescaped_string)
|
||||
|
||||
for i in ["<", ">"]:
|
||||
result_string = result_string.replace(i, f"\\{i}")
|
||||
|
||||
return result_string
|
||||
|
||||
if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
try:
|
||||
models = json.loads(readfile(self.path + "translate_models.json"))
|
||||
|
||||
if command_length == 1:
|
||||
@@ -13,7 +20,10 @@ if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
if command_length == 3:
|
||||
text_to_decode = command[2]
|
||||
else:
|
||||
text_to_decode = self.MESSAGE['reply_to_message']['text']
|
||||
if self.MESSAGE['reply_to_message'].caption:
|
||||
text_to_decode = self.MESSAGE['reply_to_message'].caption
|
||||
elif self.MESSAGE['reply_to_message'].text:
|
||||
text_to_decode = self.MESSAGE['reply_to_message'].text
|
||||
|
||||
decoded_text = text_to_decode
|
||||
if chosen_model not in models:
|
||||
@@ -25,7 +35,5 @@ if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
decoded_text = decoded_text.replace(i[0].capitalize(), i[1].capitalize())
|
||||
decoded_text = decoded_text.replace(i[0].upper(), i[1].upper())
|
||||
|
||||
self.RESPONSE = f"Результат: {decoded_text}"
|
||||
|
||||
except Exception as e:
|
||||
print(f"[translit-decoder] Got exception: {e}")
|
||||
self.RESPONSE = f"<b><u>Результат</u></b>\n{escaped_string(decoded_text)}"
|
||||
self.FORMAT = "HTML"
|
||||
|
||||
Reference in New Issue
Block a user