Compare commits
62 Commits
Author | SHA1 | Date |
---|---|---|
dymik739 | be7197a999 | |
dymik739 | 6640bfaee8 | |
dymik739 | 3554e2ac48 | |
dymik739 | d4cd31818f | |
dymik739 | 25457132fb | |
dymik739 | c881d54a4e | |
dymik739 | c283414fe3 | |
dymik739 | d4710eb994 | |
dymik739 | 86e4900dad | |
dymik739 | 518b022e2b | |
dymik739 | 9d2ecab090 | |
dymik739 | b02cee4fdb | |
dymik739 | 14ab2d3038 | |
dymik739 | 0005bb3bdb | |
dymik739 | 4ac6261fd5 | |
dymik739 | 3a3f76d4d7 | |
dymik739 | 97588b32af | |
dymik739 | c0e72a5ca0 | |
dymik739 | f6859cd748 | |
dymik739 | b546d2c8d2 | |
dymik739 | 9561075e2e | |
dymik739 | e80b5c1c22 | |
dymik739 | 74c05c8290 | |
dymik739 | 99a8da384f | |
dymik739 | 8576e7afe7 | |
dymik739 | a75a33826d | |
dymik739 | a62f38ec2f | |
dymik739 | f2bddd3690 | |
dymik739 | b049f0a152 | |
dymik739 | 1d22a31418 | |
dymik739 | 12b74d54fb | |
dymik739 | 29602f2adf | |
Misha | 08672bdbbe | |
dymik739 | f1f69b4395 | |
dymik739 | 56c45d1beb | |
dymik739 | 11acdb6fd4 | |
dymik739 | e830bae282 | |
dymik739 | 2a9bd28d65 | |
dymik739 | 2b8105d2a8 | |
dymik739 | a7bbb1c1cc | |
dymik739 | e002dc46a2 | |
dymik739 | 51307b5234 | |
dymik739 | ec22c72afb | |
dymik739 | 79a307a7b5 | |
dymik739 | 3e38c113d9 | |
dymik739 | 7d0d816ca8 | |
dymik739 | 376ffd4957 | |
dymik739 | a530272408 | |
dymik739 | 807dee5af1 | |
dymik739 | f591c8d54a | |
dymik739 | 48e672a7b0 | |
dymik739 | b5a37acecb | |
dymik739 | 187d990d2b | |
dymik739 | 151107aa81 | |
dymik739 | 2446a20a5b | |
dymik739 | 4502e7fbe1 | |
dymik739 | 34439e944b | |
dymik739 | dc8056abed | |
dymik739 | 9bdf8d0775 | |
dymik739 | 34f9b83a95 | |
dymik739 | 87928df3f7 | |
dymik739 | baf815e74d |
164
main.py
164
main.py
|
@ -11,7 +11,12 @@ import traceback
|
|||
|
||||
# global variables
|
||||
STOP_REQUESTED = False
|
||||
DEBUG_MODE = False
|
||||
DELAY_AFTER_RESPONSE = 3
|
||||
DELAY_AFTER_MESSAGE = 0.1
|
||||
DELAY_AFTER_IDLE = 1.0
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
# some functions that increase readability of the code
|
||||
def readfile(filename):
|
||||
|
@ -44,6 +49,8 @@ class ModuleV1:
|
|||
|
||||
def set_predefine(self):
|
||||
try:
|
||||
if DEBUG_MODE:
|
||||
print(f"Predefine on module v1 {self.alias} ({self.path})")
|
||||
exec(self.predefine)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\" "
|
||||
|
@ -55,11 +62,13 @@ class ModuleV1:
|
|||
|
||||
self.MESSAGE = msg
|
||||
try:
|
||||
if DEBUG_MODE:
|
||||
print(f"Calling module v1 {self.alias} ({self.path})")
|
||||
exec(self.code)
|
||||
return self.RESPONSE, self.FORMAT
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
print(f"[ERROR] module v1: traceback:\ntraceback.format_exc()")
|
||||
print(f"[ERROR] module v1: traceback:\n{traceback.format_exc()}")
|
||||
return "", None
|
||||
|
||||
|
||||
|
@ -75,6 +84,8 @@ class ModuleV2:
|
|||
# running the module
|
||||
def process(self, msg):
|
||||
try:
|
||||
if DEBUG_MODE:
|
||||
print(f"Calling module v2 {self.alias} ({self.path})")
|
||||
return self.obj.process(msg, self.path)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
|
@ -93,7 +104,7 @@ class ModuleControlUnit:
|
|||
def reload_modules(self):
|
||||
for folder in os.listdir("modules/"):
|
||||
try:
|
||||
meta_raw = readfile("modules/{}/meta.json".format(folder))
|
||||
meta_raw = readfile(f"modules/{folder}/meta.json")
|
||||
if not meta_raw:
|
||||
print(f"[WARN] module_loader: no meta.json found in module folder \"{folder}\"")
|
||||
continue
|
||||
|
@ -106,9 +117,9 @@ class ModuleControlUnit:
|
|||
else:
|
||||
index_file = "index.py"
|
||||
|
||||
code = readfile( "modules/{}/{}".format(folder, index_file) )
|
||||
code = readfile(f"modules/{folder}/{index_file}")
|
||||
if not code: # False both when readfile() returns False and when the code string is empty
|
||||
print("[WARN] reload_modules: module {} does not have any code, skipping...".format(folder))
|
||||
print(f"[WARN] reload_modules: module {folder} does not have any code, skipping...")
|
||||
continue
|
||||
|
||||
if "start_on_boot" in meta:
|
||||
|
@ -122,7 +133,7 @@ class ModuleControlUnit:
|
|||
alias = None
|
||||
|
||||
if "predefine" in meta:
|
||||
predefine = readfile("modules/{}/{}".format(folder, meta["predefine"]))
|
||||
predefine = readfile(f"modules/{folder}/{meta['predefine']}")
|
||||
else:
|
||||
predefine = False
|
||||
|
||||
|
@ -166,16 +177,19 @@ def queue_processor():
|
|||
try:
|
||||
if len(message_queue) > 0:
|
||||
msg = message_queue[0]
|
||||
print("[DEBUG] queue_processor: {}".format(msg)) # debug
|
||||
del message_queue[0]
|
||||
print(f"[DEBUG] queue_processor: {msg}") # debug
|
||||
|
||||
# check for control commands
|
||||
if msg["chat"]["id"] == 575246355:
|
||||
if msg.from_user.id == 575246355:
|
||||
if msg["text"][0] == "$":
|
||||
command = msg["text"][1:].split(" ")
|
||||
command = msg["text"][1:].split()
|
||||
|
||||
if len(command) >= 2 and command[0] == "module":
|
||||
if command[1] == "reload":
|
||||
print("[INFO] Module reloading triggered by a command")
|
||||
if len(command) == 2:
|
||||
print("[INFO] Full module reloading triggered by a command")
|
||||
updater.bot.send_message(msg.chat.id, f"Reloading all modules...")
|
||||
|
||||
# properly reload all v2 modules
|
||||
for mod in mcu.modules:
|
||||
|
@ -184,55 +198,159 @@ def queue_processor():
|
|||
|
||||
del mcu.modules[:]
|
||||
mcu.reload_modules()
|
||||
else:
|
||||
# TO DO: make it possible to reload individual modules by their
|
||||
# alias or containing folder
|
||||
pass
|
||||
|
||||
elif command[1] == "enable" and len(command) == 3:
|
||||
if command[2] == "all":
|
||||
for mod in mcu.modules:
|
||||
mod.enabled = True
|
||||
print(f"[INFO] module {mod.alias} was enabled")
|
||||
else:
|
||||
for mod in mcu.modules:
|
||||
if mod.alias == command[2]:
|
||||
mod.enabled = True
|
||||
print(f"[INFO] module {mod.alias} was enabled")
|
||||
|
||||
elif command[1] == "disable" and len(command) == 3:
|
||||
if command[2] == "all":
|
||||
for mod in mcu.modules:
|
||||
mod.enabled = False
|
||||
print(f"[INFO] module {mod.alias} was disabled")
|
||||
else:
|
||||
for mod in mcu.modules:
|
||||
if mod.alias == command[2]:
|
||||
mod.enabled = False
|
||||
print(f"[INFO] module {mod.alias} was disabled")
|
||||
|
||||
elif command[1] == "status" and len(command) == 3:
|
||||
if command[2] == "all":
|
||||
for mod in mcu.modules:
|
||||
print(f"[INFO] module {mod.alias} is {mod.enabled}")
|
||||
else:
|
||||
for mod in mcu.modules:
|
||||
if mod.alias == command[2]:
|
||||
print(f"[INFO] module {mod.alias} is {mod.enabled}")
|
||||
|
||||
elif (2 <= len(command) <= 3) and command[0] == "delay":
|
||||
l = len(command)
|
||||
|
||||
if command[1] == "response":
|
||||
if l == 3:
|
||||
try:
|
||||
new_value = float(command[2])
|
||||
global DELAY_AFTER_RESPONSE
|
||||
DELAY_AFTER_RESPONSE = new_value
|
||||
print(f"[INFO]: Set DELAY_AFTER_RESPONSE to {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"Set DELAY_AFTER_RESPONSE to {command[2]}")
|
||||
except:
|
||||
print(f"[WARN]: Cannot set DELAY_AFTER_RESPONSE to non-float value of {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"[WARN]: Cannot set DELAY_AFTER_RESPONSE to non-float value of {command[2]}")
|
||||
elif l == 2:
|
||||
print(f"[INFO]: DELAY_AFTER_RESPONSE = {DELAY_AFTER_RESPONSE}")
|
||||
updater.bot.send_message(msg.chat.id, f"[INFO]: DELAY_AFTER_RESPONSE = {DELAY_AFTER_RESPONSE}")
|
||||
|
||||
elif command[1] == "message":
|
||||
if l == 3:
|
||||
try:
|
||||
new_value = float(command[2])
|
||||
global DELAY_AFTER_MESSAGE
|
||||
DELAY_AFTER_MESSAGE = new_value
|
||||
print(f"[INFO]: Set DELAY_AFTER_MESSAGE to {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"Set DELAY_AFTER_MESSAGE to {command[2]}")
|
||||
except:
|
||||
print("[WARN]: Cannot set DELAY_AFTER_MESSAGE to non-float value of {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"[WARN]: Cannot set DELAY_AFTER_MESSAGE to non-float value of {command[2]}")
|
||||
elif l == 2:
|
||||
print(f"[INFO]: DELAY_AFTER_MESSAGE = {DELAY_AFTER_MESSAGE}")
|
||||
updater.bot.send_message(msg.chat.id, f"[INFO]: DELAY_AFTER_MESSAGE = {DELAY_AFTER_MESSAGE}")
|
||||
|
||||
elif command[1] == "idle":
|
||||
if l == 3:
|
||||
try:
|
||||
new_value = float(command[2])
|
||||
global DELAY_AFTER_IDLE
|
||||
DELAY_AFTER_IDLE = new_value
|
||||
print(f"[INFO]: Set DELAY_AFTER_IDLE to {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"Set DELAY_AFTER_IDLE to {command[2]}")
|
||||
except:
|
||||
print("[WARN]: Cannot set DELAY_AFTER_IDLE to non-float value of {command[2]}")
|
||||
updater.bot.send_message(msg.chat.id, f"[WARN]: Cannot set DELAY_AFTER_IDLE to non-float value of {command[2]}")
|
||||
elif l == 2:
|
||||
print(f"[INFO]: DELAY_AFTER_IDLE = {DELAY_AFTER_IDLE}")
|
||||
updater.bot.send_message(msg.chat.id, f"[INFO]: DELAY_AFTER_IDLE = {DELAY_AFTER_IDLE}")
|
||||
|
||||
elif len(command) == 2 and command[0] == "queue":
|
||||
if command[1] == "size":
|
||||
print(f"[INFO]: Queue length is {len(message_queue)}")
|
||||
updater.bot.send_message(msg.chat.id, f"[INFO]: Queue length is {len(message_queue)}")
|
||||
|
||||
elif len(command) == 2 and command[0] == "debug":
|
||||
global DEBUG_MODE
|
||||
if command[1] == "on":
|
||||
print("[INFO] Debug mode is enabled")
|
||||
DEBUG_MODE = True
|
||||
else:
|
||||
print("[INFO] Debug mode is disabled")
|
||||
DEBUG_MODE = False
|
||||
|
||||
del message_queue[0]
|
||||
continue
|
||||
|
||||
# modules are used in here
|
||||
for mod in mcu.modules:
|
||||
if mod.enabled:
|
||||
if mod.version in [1, 2]:
|
||||
try:
|
||||
response, formatting = mod.process(msg)
|
||||
except Exception as e:
|
||||
print(f"Module {mod.alias} ({mod.path}) failed to do a proper return, skipping...")
|
||||
continue
|
||||
|
||||
if response:
|
||||
if formatting == None:
|
||||
if not formatting:
|
||||
print(f"Responding using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
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: {response}")
|
||||
time.sleep(DELAY_AFTER_RESPONSE)
|
||||
break
|
||||
|
||||
elif formatting in ["Markdown", "MarkdownV2", "HTML"]:
|
||||
print(f"Responding using module {mod.path} ({mod.alias}) with text (using {formatting}): {response}")
|
||||
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}")
|
||||
time.sleep(DELAY_AFTER_RESPONSE)
|
||||
break
|
||||
|
||||
del message_queue[0]
|
||||
|
||||
time.sleep(0.1)
|
||||
time.sleep(DELAY_AFTER_MESSAGE)
|
||||
else:
|
||||
if STOP_REQUESTED:
|
||||
break
|
||||
else:
|
||||
time.sleep(1)
|
||||
time.sleep(DELAY_AFTER_IDLE)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] queue_processor: current message queue: {message_queue}")
|
||||
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")
|
||||
except:
|
||||
print("[WARN] queue_processor: message seems absent, whatever")
|
||||
print(f"[ERROR] queue_processor: error while processing message ({e})...")
|
||||
print("[INFO] queue_processor: skipped broken message")
|
||||
|
||||
print("[INFO] queue_processor thread stops successfully")
|
||||
|
||||
|
||||
# telegram bot processor
|
||||
def message_handler(update, context):
|
||||
global lock
|
||||
with lock:
|
||||
if update.message and update.message.text.__class__ == str and update.message.text.startswith("$"):
|
||||
print("[DEBUG] Received new message with high priority") # just for testing
|
||||
message_queue.insert(0, update.message)
|
||||
elif update.message:
|
||||
print("[DEBUG] Received new message") # just for testing
|
||||
message_queue.append(update.message)
|
||||
else:
|
||||
print(f"[DEBUG] Received {update.message} instead of a message")
|
||||
|
||||
|
||||
# --- Final stage ---
|
||||
|
|
|
@ -195,7 +195,7 @@ def queue_processor():
|
|||
response, formatting = mod.process(msg)
|
||||
|
||||
if response:
|
||||
if formatting == None:
|
||||
if not formatting:
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
break
|
||||
elif formatting in ["Markdown", "MarkdownV2", "HTML"]:
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../auto-schedule-pro/additions.json
|
|
@ -24,7 +24,15 @@ WEEKDAYS_GENITIVE_THIS = ["цього понеділка", "цього вівт
|
|||
lesson_types_to_strings = {
|
||||
"lec": "лекція",
|
||||
"prac": "практика",
|
||||
"lab": "лабораторна"
|
||||
"lab": "лабораторна",
|
||||
"con": "консультація"
|
||||
}
|
||||
|
||||
color_code_mapping = {
|
||||
"lec": "🔵",
|
||||
"prac": "🟡",
|
||||
"lab": "🔴",
|
||||
"con": "🟢"
|
||||
}
|
||||
|
||||
|
||||
|
@ -113,6 +121,10 @@ def load_template(template, part):
|
|||
return readfile(f"templates/{template}/{part}.msg")
|
||||
|
||||
|
||||
def get_color_code(lesson_type):
|
||||
return color_code_mapping[lesson_type]
|
||||
|
||||
|
||||
def escaped_string_markdownV2(input_string):
|
||||
result_string = input_string
|
||||
|
||||
|
@ -164,9 +176,6 @@ def get_name_of_lesson_type(lesson_type):
|
|||
|
||||
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 lesson.__class__ == dict:
|
||||
if force_date_at_top:
|
||||
|
@ -175,29 +184,55 @@ def generate_lesson_description(lesson, start_datetime, end_datetime, current_da
|
|||
current_day, current_week)
|
||||
total_result = total_result.replace("%DATE%", human_readable_date)
|
||||
|
||||
if "full" in overrides and overrides["full"]:
|
||||
total_result += load_template(template, "multiple")
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
else:
|
||||
total_result += load_template(template, "multiple-short")
|
||||
|
||||
for i in ['name', 'teacher']:
|
||||
total_result = total_result.replace(f"%{i.upper()}%", lesson[i])
|
||||
|
||||
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)
|
||||
total_result = total_result.replace("%COLOR_CODE%", get_color_code(lesson['type']))
|
||||
|
||||
return total_result + "\n"
|
||||
if ('nolink' not in lesson) or (not lesson['nolink']):
|
||||
total_result = total_result.replace("%LINK%", lesson['link'])
|
||||
else:
|
||||
total_result = total_result.replace("%LINK%", "#")
|
||||
|
||||
if 'comment' in lesson:
|
||||
total_result += load_template(template, "comment")
|
||||
total_result = total_result.replace("%COMMENT%", lesson["comment"])
|
||||
|
||||
if "full" in overrides and overrides["full"]:
|
||||
total_result += "\n"
|
||||
|
||||
return total_result
|
||||
|
||||
else:
|
||||
active_template = load_template(template, "single")
|
||||
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
for i in ['name', 'teacher']:
|
||||
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)
|
||||
active_template = active_template.replace("%COLOR_CODE%", get_color_code(lesson['type']))
|
||||
|
||||
if ('nolink' not in lesson) or (not lesson['nolink']):
|
||||
active_template = active_template.replace("%LINK%", lesson['link'])
|
||||
else:
|
||||
active_template = active_template.replace("%LINK%", "#")
|
||||
|
||||
if 'comment' in lesson:
|
||||
active_template += load_template(template, "comment")
|
||||
active_template = active_template.replace("%COMMENT%", lesson["comment"])
|
||||
|
||||
return active_template
|
||||
|
||||
|
@ -208,16 +243,32 @@ def generate_lesson_description(lesson, start_datetime, end_datetime, current_da
|
|||
total_result = total_result.replace("%DATE%", human_readable_date)
|
||||
|
||||
for l in lesson:
|
||||
if "full" in overrides and overrides["full"]:
|
||||
active_template = load_template(template, "multiple")
|
||||
else:
|
||||
active_template = load_template(template, "multiple-short")
|
||||
|
||||
for i in ['name', 'teacher', 'link']:
|
||||
for i in ['name', 'teacher']:
|
||||
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)
|
||||
active_template = active_template.replace("%COLOR_CODE%", get_color_code(l['type']))
|
||||
|
||||
total_result += active_template + "\n"
|
||||
if ('nolink' not in lesson) or (not lesson['nolink']):
|
||||
active_template = active_template.replace("%LINK%", l['link'])
|
||||
else:
|
||||
active_template = active_template.replace("%LINK%", "#")
|
||||
|
||||
if 'comment' in lesson:
|
||||
active_template += load_template(template, "comment")
|
||||
active_template = active_template.replace("%COMMENT%", lesson["comment"])
|
||||
|
||||
if "full" in overrides and overrides["full"]:
|
||||
active_template += "\n"
|
||||
|
||||
total_result += active_template
|
||||
|
||||
return total_result
|
||||
|
||||
|
@ -289,7 +340,8 @@ def process(message, path):
|
|||
# one printable symbol, so this is already protected
|
||||
base_command = full_command[0].lower()
|
||||
|
||||
if base_command not in ["!пара", "!пари", "!schedule-ctl"]:
|
||||
if base_command not in ["!пара", "!пари", "!schedule-ctl",
|
||||
"!para", "!pary"]:
|
||||
return None, None
|
||||
|
||||
global module_path
|
||||
|
@ -308,18 +360,23 @@ def process(message, path):
|
|||
|
||||
reference_time = int(current_time.strftime("%s")) - current_seconds
|
||||
|
||||
if base_command == "!пара":
|
||||
if base_command in ["!пара", "!para"]:
|
||||
# easter egg
|
||||
study_begin_ts = int(datetime(year=2023, month=9, day=4).strftime("%s"))
|
||||
study_begin_ts = int(datetime(year=2024, month=9, day=2).strftime("%s"))
|
||||
current_ts = int(datetime.now().strftime("%s"))
|
||||
|
||||
if -3600*4 < study_begin_ts - current_ts < 0:
|
||||
until_study_day = study_begin_ts - current_ts
|
||||
|
||||
if -3600*4 < until_study_day < 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:
|
||||
elif 0 <= until_study_day < 3600*24*28:
|
||||
return f"До навчання залишилося {until_study_day} секунд..." \
|
||||
f" ({round(until_study_day/3600, 4)} годин," \
|
||||
f" {round(until_study_day/3600/24, 4)} діб)", None
|
||||
elif until_study_day >= 3600*24*14:
|
||||
return "Ви маєте законне право відпочити, пари почнуться не скоро", None
|
||||
|
||||
|
||||
# actual lesson finding code
|
||||
upcoming_lessons = [timestamp for timestamp in schedule if timestamp > current_seconds - 5400]
|
||||
|
||||
|
@ -357,7 +414,7 @@ def process(message, path):
|
|||
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 == "!пари":
|
||||
elif base_command in ["!пари", "!pary"]:
|
||||
base_day = current_week * 7 + current_day
|
||||
|
||||
if len(full_command) >= 2:
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
[
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
|
@ -0,0 +1,54 @@
|
|||
[
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"9:00": {
|
||||
"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (ЕКЗАМЕН)",
|
||||
"teacher": "Овчар Раїса Федорівна",
|
||||
"link": "https://us02web.zoom.us/j/84532519615?pwd=eDFRMWtJTkxKcklpa1JUSjFmZHNyUT09",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"9:00": {
|
||||
"name": "Інженерія програмного забезпечення (ЕКЗАМЕН)",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"16:30": {
|
||||
"name": "Теорія електричних кіл та сигналів",
|
||||
"teacher": "Лободзинський Вадим Юрійович",
|
||||
"link": "https://meet.google.com/gwx-sshq-sqb",
|
||||
"type": "con",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"9:00": {
|
||||
"name": "Теорія електричних кіл та сигналів (ЕКЗАМЕН)",
|
||||
"teacher": "Лободзинський Вадим Юрійович",
|
||||
"link": "https://meet.google.com/gwx-sshq-sqb",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
|
@ -0,0 +1,307 @@
|
|||
[
|
||||
{
|
||||
"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=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09",
|
||||
"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://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"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": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039",
|
||||
"type": "lec",
|
||||
"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/tno-cxef-zyi",
|
||||
"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": "https://zoom.us/j/9358038101?pwd=d0pwUHRDY0dxbngrU09PYll6UXpNZz09",
|
||||
"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": "https://us02web.zoom.us/j/84532519615?pwd=eDFRMWtJTkxKcklpa1JUSjFmZHNyUT09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:00": {
|
||||
"name": "Теорія ймовірності та математична статистика",
|
||||
"teacher": "Марковський Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc",
|
||||
"type": "con",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{
|
||||
"10:25": [
|
||||
{
|
||||
"name": "Психологія",
|
||||
"teacher": "Сербова О. В.",
|
||||
"link": "https://us05web.zoom.us/j/9299459744?pwd=Z3VQdWEvQ0tyc3pMbzl2bHN6Y1VlUT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Психологія конфлікту",
|
||||
"teacher": "Кононець М. О.",
|
||||
"link": "https://zoom.us/j/9953120638?pwd=WGZsYUhPK2hxbUc4YVJmT0lhdysyZz09",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Політична наука: конфліктологічний підхід",
|
||||
"teacher": "Северинчик О. П.",
|
||||
"link": "https://us04web.zoom.us/j/2279372490?pwd=bHR5QmpCT0tvQXJMLzRzaldHbFZ3dz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Захист персональних даних: стандарти ЄС та Ради Європи",
|
||||
"teacher": "Самчинська О. А.",
|
||||
"link": "https://us04web.zoom.us/j/72149205587?pwd=Ld2Xj7RORYEwnUYauB5yEbATwwsNan.1",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"14:15": {
|
||||
"name": "Розумні міста",
|
||||
"teacher": "Чукут Світлана Анатоліївна",
|
||||
"link": "https://zoom.us/j/5439919039?pwd=Um8wWHV4ZjZpallCWkpVQ08wZGNzdz09",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Вступ до філософії",
|
||||
"teacher": "Руденко Тамара Петрівна",
|
||||
"link": "https://zoom.us/j/9358038101?pwd=d0pwUHRDY0dxbngrU09PYll6UXpNZz09",
|
||||
"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": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": {
|
||||
"name": "Інженерія програмного забезпечення",
|
||||
"teacher": "Васильєва Марія Давидівна",
|
||||
"link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Вступ до операційної системи Linux",
|
||||
"teacher": "Алєнін Олег Ігорович",
|
||||
"link": "https://us04web.zoom.us/j/4122071690?pwd=bANFi3fk9pWvRu9TSBRGzfxFHuEkZC.1",
|
||||
"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/tno-cxef-zyi",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
"14:15": [
|
||||
{
|
||||
"name": "Соціальна психологія",
|
||||
"teacher": "Винославська О. В.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Розумні міста",
|
||||
"teacher": "Чукут Світлана Анатоліївна",
|
||||
"link": "https://zoom.us/j/5439919039?pwd=Um8wWHV4ZjZpallCWkpVQ08wZGNzdz09",
|
||||
"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": "https://us02web.zoom.us/j/84532519615?pwd=eDFRMWtJTkxKcklpa1JUSjFmZHNyUT09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:00": {
|
||||
"name": "Теорія ймовірності та математична статистика",
|
||||
"teacher": "Марковський Олександр Петрович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc",
|
||||
"type": "con",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{}
|
||||
]
|
|
@ -0,0 +1,51 @@
|
|||
[
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"9:00": {
|
||||
"name": "Системне програмування",
|
||||
"teacher": "Порєв Віктор Миколайович",
|
||||
"link": "https://us02web.zoom.us/j/2256183863?pwd=Q3FmZGVSbW5xUnFQZERpdlcxSElrUT09",
|
||||
"type": "prac",
|
||||
"selectable": false,
|
||||
"comment": "Екзамен!"
|
||||
}
|
||||
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"14:00": {
|
||||
"name": "Комп'ютерна електроніка",
|
||||
"teacher": "Виноградов Юрій Миколайович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/x2g-dqc-6fg",
|
||||
"type": "lab",
|
||||
"selectable": false,
|
||||
"comment": "Екзамен! Деталі: https://t.me/c/1856295652/522"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"9:00": {
|
||||
"name": "Архітектура комп'ютерів. Частина 1. Арифметичні та управляючі пристрої",
|
||||
"teacher": "Жабін Валерій Іванович",
|
||||
"link": "https://bbb.comsys.kpi.ua/rooms/jwe-mmp-lb5-jf2/join",
|
||||
"type": "prac",
|
||||
"selectable": false,
|
||||
"comment": "Екзамен!"
|
||||
}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
|
@ -0,0 +1,348 @@
|
|||
[
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Алгоритми та методи обчислень",
|
||||
"teacher": "Новотарський Михайло Анатолійович",
|
||||
"link": "https://us02web.zoom.us/j/85323196480?pwd=aXRONTh2SUxmdFZ5M1N5NU5VcGVlZz09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Комп'ютерна електроніка",
|
||||
"teacher": "Виноградов Юрій Миколайович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/x2g-dqc-6fg",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Практичний курс іноземної мови. Частина 2",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "https://meet.google.com/tno-cxef-zyi",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Комп'ютерна електроніка",
|
||||
"teacher": "Виноградов Юрій Миколайович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/x2g-dqc-6fg",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Стратегія охорони навколишнього середовища",
|
||||
"teacher": "Романюкіна Ірина Юріївна",
|
||||
"link": "https://us05web.zoom.us/j/84713917316?pwd=MR0w0aDdxnka2H64qqCpVcUgfuhaQP.1",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": [
|
||||
{
|
||||
"name": "Естетика промислового дизайну",
|
||||
"teacher": "Кузіна Ольга Юріївна",
|
||||
"link": "https://us05web.zoom.us/j/87803902417?pwd=64D8BbLeLkvweVlWlY2lX95UaA0XMG.1",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Logic",
|
||||
"teacher": "Казаков Мстислав Андрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Дизайн презентації для професійної діяльності",
|
||||
"teacher": "Іщенко Олександр Анатолійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Стилі в образотворчому мистецтві",
|
||||
"teacher": "Оляніна Світлана Валеріївна",
|
||||
"link": "https://us05web.zoom.us/j/85408874003?pwd=UGdyRWNwSytSM0Zhc3dMTG4yek9sdz09",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"10:25": [
|
||||
{
|
||||
"name": "Основи підприємницької діяльності",
|
||||
"teacher": "Марченко Валентина Миколаївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Корпоративна культура та діловий етикет",
|
||||
"teacher": "Цимбаленко Яна Юріївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Дизайн презентації для професійної діяльності",
|
||||
"teacher": "Іщенко Олександр Анатолійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Логіка",
|
||||
"teacher": "Піхорович Василь Дмитрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Корпоративна культура та діловий етикет",
|
||||
"teacher": "Тимошенко Наталія Леонідівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Циклічні види спорту",
|
||||
"teacher": "Черевичко Олександр Геннадійович",
|
||||
"link": "https://us05web.zoom.us/j/84221628555?pwd=ZjVDV3lDTjRES0lOdkk4cUlUaWp0UT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"14:15": [
|
||||
{
|
||||
"name": "Єдиноборства",
|
||||
"teacher": "Назимок Віктор Васильович",
|
||||
"link": "https://us04web.zoom.us/j/2276337141?pwd=ejNrUkpPQk9iQlhMMnprOEg3UHNnZz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Ігрові види спорту",
|
||||
"teacher": "Сироватко З. В.",
|
||||
"link": "https://us05web.zoom.us/j/7112676497?pwd=SzEySzRGUzh6NGcxdXZtQ2ovYzhCUT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Силові види спорту",
|
||||
"teacher": "Корюкаєв Микола Миколайович",
|
||||
"link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Складно-координаційні види спорту",
|
||||
"teacher": "Козлова Тетяна Георгіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Алгоритми та методи обчислень",
|
||||
"teacher": "Порєв Віктор Миколайович",
|
||||
"link": "https://us02web.zoom.us/j/2256183863?pwd=Q3FmZGVSbW5xUnFQZERpdlcxSElrUT09",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Організація баз даних",
|
||||
"teacher": "Болдак Андрій Олександрович",
|
||||
"link": "https://us04web.zoom.us/j/5439063374?pwd=VG1iODU0WmpCNTlCVXJJTitYU2Nmdz09",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Системне програмування",
|
||||
"teacher": "Порєв Віктор Миколайович",
|
||||
"link": "https://us02web.zoom.us/j/2256183863?pwd=Q3FmZGVSbW5xUnFQZERpdlcxSElrUT09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Організація баз даних",
|
||||
"teacher": "Болдак Андрій Олександрович",
|
||||
"link": "https://us04web.zoom.us/j/5439063374?pwd=VG1iODU0WmpCNTlCVXJJTitYU2Nmdz09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Архітектура комп'ютерів. Частина 1. Арифметичні та управляючі пристрої",
|
||||
"teacher": "Жабін Валерій Іванович",
|
||||
"link": "https://bbb.comsys.kpi.ua/rooms/jwe-mmp-lb5-jf2/join",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Стратегія охорони навколишнього середовища",
|
||||
"teacher": "Романюкіна Ірина Юріївна",
|
||||
"link": "https://us05web.zoom.us/j/84674156408?pwd=BoZcB13bbA82SxL503YaQgabjUiqC9.1",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"10:25": {
|
||||
"name": "Алгоритми та методи обчислень",
|
||||
"teacher": "Новотарський Михайло Анатолійович",
|
||||
"link": "https://us02web.zoom.us/j/85323196480?pwd=aXRONTh2SUxmdFZ5M1N5NU5VcGVlZz09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Комп'ютерна електроніка",
|
||||
"teacher": "Виноградов Юрій Миколайович",
|
||||
"link": "https://bbb.comsys.kpi.ua/b/x2g-dqc-6fg",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Архітектура комп'ютерів. Частина 1. Арифметичні та управляючі пристрої",
|
||||
"teacher": "Верба Олександр Андрійович",
|
||||
"link": "https://us04web.zoom.us/j/7382214783?pwd=RnZ3SWgwK1JoVkZtNndnKzdPZjFGdz09",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Практичний курс іноземної мови. Частина 2",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "https://meet.google.com/tno-cxef-zyi",
|
||||
"type": "prac",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Стилі в образотворчому мистецтві",
|
||||
"teacher": "Оляніна Світлана Валеріївна",
|
||||
"link": "https://us05web.zoom.us/j/85408874003?pwd=UGdyRWNwSytSM0Zhc3dMTG4yek9sdz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Естетика промислового дизайну",
|
||||
"teacher": "Кузіна Ольга Юріївна",
|
||||
"link": "https://us05web.zoom.us/j/87803902417?pwd=64D8BbLeLkvweVlWlY2lX95UaA0XMG.1",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Логіка",
|
||||
"teacher": "Сторожик Марина Іванівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Logic",
|
||||
"teacher": "Казаков Мстислав Андрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Циклічні види спорту",
|
||||
"teacher": "Черевичко Олександр Геннадійович",
|
||||
"link": "https://us05web.zoom.us/j/84221628555?pwd=ZjVDV3lDTjRES0lOdkk4cUlUaWp0UT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
],
|
||||
|
||||
"14:15": [
|
||||
{
|
||||
"name": "Єдиноборства",
|
||||
"teacher": "Назимок Віктор Васильович",
|
||||
"link": "https://us04web.zoom.us/j/2276337141?pwd=ejNrUkpPQk9iQlhMMnprOEg3UHNnZz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Ігрові види спорту",
|
||||
"teacher": "Сироватко З. В.",
|
||||
"link": "https://us05web.zoom.us/j/7112676497?pwd=SzEySzRGUzh6NGcxdXZtQ2ovYzhCUT09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Силові види спорту",
|
||||
"teacher": "Корюкаєв Микола Миколайович",
|
||||
"link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
},
|
||||
{
|
||||
"name": "Складно-координаційні види спорту",
|
||||
"teacher": "Козлова Тетяна Георгіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Системне програмування",
|
||||
"teacher": "Порєв Віктор Миколайович",
|
||||
"link": "https://us02web.zoom.us/j/2256183863?pwd=Q3FmZGVSbW5xUnFQZERpdlcxSElrUT09",
|
||||
"type": "lab",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Системне програмування",
|
||||
"teacher": "Порєв Віктор Миколайович",
|
||||
"link": "https://us02web.zoom.us/j/2256183863?pwd=Q3FmZGVSbW5xUnFQZERpdlcxSElrUT09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Організація баз даних",
|
||||
"teacher": "Болдак Андрій Олександрович",
|
||||
"link": "https://us04web.zoom.us/j/5439063374?pwd=VG1iODU0WmpCNTlCVXJJTitYU2Nmdz09",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Архітектура комп'ютерів. Частина 1. Арифметичні та управляючі пристрої",
|
||||
"teacher": "Жабін Валерій Іванович",
|
||||
"link": "https://bbb.comsys.kpi.ua/rooms/jwe-mmp-lb5-jf2/join",
|
||||
"type": "lec",
|
||||
"selectable": false
|
||||
}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
|
@ -0,0 +1,699 @@
|
|||
[
|
||||
{
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Архітектура комп'ютерів. Частина 2. Процесори",
|
||||
"teacher": "Клименко Ірина Анатоліївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Паралельне програмування",
|
||||
"teacher": "Корочкін Олександр Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Комп'ютерна схемотехніка",
|
||||
"teacher": "Ткаченко Валентина Василівна & Старовєров Костянтин Сергійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Правознавство",
|
||||
"teacher": "Попов Костянтин Леонідович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"16:10": [
|
||||
{
|
||||
"name": "Вступ до штучного інтелекту",
|
||||
"teacher": "Таран Владислав Ігорович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології програмування користувацьких інтерфейсів (Front-end)",
|
||||
"teacher": "Алещенко Олексій Вадимович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології розроблення серверного програмного забезпечення (Back-end)",
|
||||
"teacher": "Валько В. .",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"8:30": [
|
||||
{
|
||||
"name": "Життєвий цикл розробки програмного забезпечення",
|
||||
"teacher": "Галушко Дмитро Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Комп’ютерна графіка та мультимедіа",
|
||||
"teacher": "Родіонов Павло Юрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Методи та технології штучного інтелекту",
|
||||
"teacher": "Шимкович Володимир Миколайович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка програмного забезпечення на платформі Java",
|
||||
"teacher": "Ковальчук Олександр Миронович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології та засоби розробки комп'ютерної графіки та мультимедіа",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"10:25": [
|
||||
{
|
||||
"name": "AGILE методологія розробки програмного забезпечення (Авторський курс компаніїї SoftServe)",
|
||||
"teacher": "Шевело Олексій Павлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Linux",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Основи Front-end технологій",
|
||||
"teacher": "Жереб К. А.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка мобільних застосувань під iOS",
|
||||
"teacher": "Храмченко Микола Сергійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розроблення застосунків з використанням Spring Framework",
|
||||
"teacher": "Букасов Максим Михайлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технологія блокчейн",
|
||||
"teacher": "Яланецький Валерій Анатолійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Методи та технології штучного інтелекту",
|
||||
"teacher": "Шимкович Володимир Миколайович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Комп’ютерна графіка та мультимедіа",
|
||||
"teacher": "Родіонов Павло Юрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології Computer Vision",
|
||||
"teacher": "Баран Данило Романович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Життєвий цикл розробки програмного забезпечення",
|
||||
"teacher": "Альбрехт Йосип Омелянович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка програмного забезпечення на платформі Java",
|
||||
"teacher": "Ковальчук Олександр Миронович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології та засоби розробки комп'ютерної графіки та мультимедіа",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"18:30": {
|
||||
"name": "Технології Computer Vision",
|
||||
"teacher": "Писарчук О О",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Правознавство",
|
||||
"teacher": "Тихонюк Ольга Володимирівна",
|
||||
"link": "(посиланя відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Комп'ютерна схемотехніка",
|
||||
"teacher": "Нікольський С С",
|
||||
"link": "(посиланя відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Практичний курс іноземної мови професійного спрямування. Частина 1",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "https://meet.google.com/tno-cxef-zyi",
|
||||
"type": "prac",
|
||||
"selectable": false,
|
||||
"nolink": false
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Вступ до штучного інтелекту",
|
||||
"teacher": "Кочура Юрій Петрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "prac",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": [
|
||||
{
|
||||
"name": "Мова програмування Java",
|
||||
"teacher": "Орленко С. П.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка програмного забезпечення на платформі Node.JS",
|
||||
"teacher": "Нечай Дмитро Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Системне програмування С і С++",
|
||||
"teacher": "Ковальов Микола Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань мовою програмування PHP",
|
||||
"teacher": "Ковтунець Олесь Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Java",
|
||||
"teacher": "Іванова Любов Миколаївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології програмування на С/Embedded (Сертифікатна програма)",
|
||||
"teacher": "Каплунов Артем Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"10:25": {
|
||||
"name": "Системне програмування С і С++",
|
||||
"teacher": "Густера Олег Михайлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Технології програмування на С/Embedded (Сертифікатна програма)",
|
||||
"teacher": "Каплунов Артем Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Розроблення застосунків з використанням Spring Framework",
|
||||
"teacher": "Нікітін Валерій Андрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"16:10": {
|
||||
"name": "Технології програмування користувацьких інтерфейсів (Front-end)",
|
||||
"teacher": "Ковальчук Олександр Миронович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"18:30": {
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Microsoft.NET",
|
||||
"teacher": "Крамар Юлія Михайлівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Архітектура комп'ютерів. Частина 2. Процесори",
|
||||
"teacher": "Клименко Ірина Анатоліївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Паралельне програмування",
|
||||
"teacher": "Корочкін Олександр Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Комп'ютерна схемотехніка",
|
||||
"teacher": "Ткаченко Валентина Василівна & Старовєров Костянтин Сергійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"14:15": {
|
||||
"name": "Технології розроблення серверного програмного забезпечення (Back-end)",
|
||||
"teacher": "Валько В. .",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"16:10": [
|
||||
{
|
||||
"name": "Вступ до штучного інтелекту",
|
||||
"teacher": "Гордієнко Юрій Григорович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології програмування користувацьких інтерфейсів (Front-end)",
|
||||
"teacher": "Алещенко Олексій Вадимович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології розроблення серверного програмного забезпечення (Back-end)",
|
||||
"teacher": "Валько В. .",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"8:30": [
|
||||
{
|
||||
"name": "Життєвий цикл розробки програмного забезпечення",
|
||||
"teacher": "Галушко Дмитро Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Комп’ютерна графіка та мультимедіа",
|
||||
"teacher": "Родіонов Павло Юрійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Методи та технології штучного інтелекту",
|
||||
"teacher": "Шимкович Володимир Миколайович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка програмного забезпечення на платформі Java",
|
||||
"teacher": "Ковальчук Олександр Миронович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології та засоби розробки комп'ютерної графіки та мультимедіа",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"10:25": [
|
||||
{
|
||||
"name": "AGILE методологія розробки програмного забезпечення (Авторський курс компаніїї SoftServe)",
|
||||
"teacher": "Шевело Олексій Павлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Linux",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Основи Front-end технологій",
|
||||
"teacher": "Жереб К. А.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка мобільних застосувань під iOS",
|
||||
"teacher": "Храмченко Микола Сергійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розроблення застосунків з використанням Spring Framework",
|
||||
"teacher": "Букасов Максим Михайлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технологія блокчейн",
|
||||
"teacher": "Яланецький Валерій Анатолійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": [
|
||||
{
|
||||
"name": "Основи Front-end технологій",
|
||||
"teacher": "Жереб К. А.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технологія блокчейн",
|
||||
"teacher": "Яланецький Валерій Анатолійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Linux",
|
||||
"teacher": "Хмелюк Марина Сергіївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка мобільних застосувань під iOS",
|
||||
"teacher": "Храмченко Микола Сергійович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "AGILE методологія розробки програмного забезпечення (Авторський курс компаніїї SoftServe)",
|
||||
"teacher": "Шевело Олексій Павлович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"18:30": {
|
||||
"name": "Технології Computer Vision",
|
||||
"teacher": "Писарчук О О",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": {
|
||||
"name": "Архітектура комп'ютерів. Частина 2. Процесори",
|
||||
"teacher": "Каплунов Артем Володимирович",
|
||||
"link": "(посиланя відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"10:25": {
|
||||
"name": "Паралельне програмування",
|
||||
"teacher": "Корочкін Олександр Володимирович",
|
||||
"link": "(посиланя відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": false,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"12:20": {
|
||||
"name": "Практичний курс іноземної мови професійного спрямування. Частина 1",
|
||||
"teacher": "Шевченко Ольга Миколаївна",
|
||||
"link": "https://meet.google.com/tno-cxef-zyi",
|
||||
"type": "prac",
|
||||
"selectable": false,
|
||||
"nolink": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"8:30": [
|
||||
{
|
||||
"name": "Мова програмування Java",
|
||||
"teacher": "Орленко С. П.",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Розробка програмного забезпечення на платформі Node.JS",
|
||||
"teacher": "Нечай Дмитро Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Системне програмування С і С++",
|
||||
"teacher": "Ковальов Микола Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань мовою програмування PHP",
|
||||
"teacher": "Ковтунець Олесь Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Java",
|
||||
"teacher": "Іванова Любов Миколаївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Технології програмування на С/Embedded (Сертифікатна програма)",
|
||||
"teacher": "Каплунов Артем Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"10:25": [
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Microsoft.NET",
|
||||
"teacher": "Крамар Юлія Михайлівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Java",
|
||||
"teacher": "Іванова Любов Миколаївна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
{
|
||||
"name": "Сучасні технології розробки WEB-застосувань мовою програмування PHP",
|
||||
"teacher": "Ковтунець Олесь Володимирович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
],
|
||||
|
||||
"12:20": {
|
||||
"name": "Розробка програмного забезпечення на платформі Node.JS",
|
||||
"teacher": "Нечай Дмитро Олександрович",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lab",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
},
|
||||
|
||||
"18:30": {
|
||||
"name": "Сучасні технології розробки WEB-застосувань на платформі Microsoft.NET",
|
||||
"teacher": "Крамар Юлія Михайлівна",
|
||||
"link": "(посилання відсутнє!)",
|
||||
"type": "lec",
|
||||
"selectable": true,
|
||||
"nolink": true
|
||||
}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
]
|
|
@ -1,286 +0,0 @@
|
|||
[
|
||||
{
|
||||
"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 @@
|
|||
schedule-v2-term5.json
|
|
@ -1 +0,0 @@
|
|||
../auto-schedule-pro/schedule.json
|
|
@ -0,0 +1 @@
|
|||
<b>Коментар</b>: %COMMENT%
|
|
@ -0,0 +1 @@
|
|||
<b><a href="%LINK%">%COLOR_CODE% %NAME%</a></b>
|
|
@ -0,0 +1 @@
|
|||
Коментар: %COMMENT%
|
|
@ -0,0 +1 @@
|
|||
<a href="%LINK%">%COLOR_CODE% %NAME%</a>
|
|
@ -0,0 +1 @@
|
|||
<i>Коментар</i>: %COMMENT%
|
|
@ -0,0 +1 @@
|
|||
<b><a href="%LINK%">%COLOR_CODE% %NAME%</a></b>
|
|
@ -5,51 +5,51 @@
|
|||
"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"},
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лабораторна)", "teacher": "Васильєва Марія Давидівна", "link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039"},
|
||||
"14:15": {"name": "Теорія електричних кіл та сигналів (лабораторна)", "teacher": "Лободзинський В. Ю. & Ілліна О. О.", "link": "https://meet.google.com/gwx-sshq-sqb"}
|
||||
},
|
||||
{
|
||||
"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": "(посилання відсутнє!)"}
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "(посилання відсутнє!)"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh"},
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "https://us04web.zoom.us/j/2313886209?pwd=dnZHanV3cU9LUXJBVWYyYVArUFg5dz09"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "https://meet.google.com/tno-cxef-zyi"},
|
||||
"14:15": {"name": "Соціальна психологія (практика)", "teacher": "Блохіна Ірина Олександрівна", "link": "(посилання відсутнє!)"},
|
||||
"16:10": {"name": "Основи електронного урядування (практика)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"8:30": {"name": "Вступ до філософії (лекція)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"8:30": {"name": "Вступ до філософії (лекція)", "teacher": "Руденко Тамара Петрівна", "link": "https://zoom.us/j/9358038101?pwd=d0pwUHRDY0dxbngrU09PYll6UXpNZz09"},
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "https://us02web.zoom.us/j/84532519615?pwd=eDFRMWtJTkxKcklpa1JUSjFmZHNyUT09"}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"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": "(посилання відсутнє!)"}
|
||||
"10:25": {"name": "Психологія (практика) & Психологія конфлікту (лекція)", "teacher": "Сербова О. В. & Кононець М. О.", "link": "https://us05web.zoom.us/j/9299459744?pwd=Z3VQdWEvQ0tyc3pMbzl2bHN6Y1VlUT09 & https://zoom.us/j/9953120638?pwd=WGZsYUhPK2hxbUc4YVJmT0lhdysyZz09"},
|
||||
"12:20": {"name": "Політична наука: конфліктологічний підхід & Захист персональних даних: стандарти ЄС та Ради Європи (практики)", "teacher": "Северинчик О. П. & Самчинська О. А.", "link": "(посилання відсутнє!) & https://us04web.zoom.us/j/72149205587?pwd=Ld2Xj7RORYEwnUYauB5yEbATwwsNan.1"},
|
||||
"14:15": {"name": "Розумні міста (лекція)", "teacher": "Чукут Світлана Анатоліївна", "link": "https://zoom.us/j/5439919039?pwd=Um8wWHV4ZjZpallCWkpVQ08wZGNzdz09"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вступ до філософії (практика)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"14:15": {"name": "Теорія ймовірності та математична статистика (практика)", "teacher": "Марковський Олександр Петрович", "link": "(посилання відсутнє!)"}
|
||||
"10:25": {"name": "Вступ до філософії (практика)", "teacher": "Руденко Тамара Петрівна", "link": "https://zoom.us/j/9358038101?pwd=d0pwUHRDY0dxbngrU09PYll6UXpNZz09"},
|
||||
"14:15": {"name": "Теорія ймовірності та математична статистика (практика)", "teacher": "Марковський Олександр Петрович", "link": "https://bbb.comsys.kpi.ua/b/ole-9ru-7vc"}
|
||||
},
|
||||
{
|
||||
"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": "(посилання відсутнє!)"}
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039"},
|
||||
"14:15": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "https://do.ipo.kpi.ua/mod/bigbluebuttonbn/view.php?id=171039"}
|
||||
},
|
||||
{
|
||||
"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": "(посилання відсутні!)"}
|
||||
"8:30": {"name": "Вступ до операційної системи Linux (лабораторна)", "teacher": "Алєнін Олег Ігорович", "link": "https://us04web.zoom.us/j/4122071690?pwd=bANFi3fk9pWvRu9TSBRGzfxFHuEkZC.1"},
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "https://us04web.zoom.us/j/2313886209?pwd=dnZHanV3cU9LUXJBVWYyYVArUFg5dz09"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "https://meet.google.com/tno-cxef-zyi"},
|
||||
"14:15": {"name": "Соціальна психологія (лекція) & Розумні міста (практика)", "teacher": "Винославська О. В. & Чукут С. А.", "link": "(посилання відсутнє!) & https://zoom.us/j/5439919039?pwd=Um8wWHV4ZjZpallCWkpVQ08wZGNzdz09"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "https://us02web.zoom.us/j/84532519615?pwd=eDFRMWtJTkxKcklpa1JUSjFmZHNyUT09"}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"s": "Головна сторінка сервера: http://10.1.1.1:12010/",
|
||||
"ss": "Головна сторінка сервера: http://10.1.1.1:12010/",
|
||||
"u": "Універсальне посилання: http://10.1.1.1:12025/?d=1",
|
||||
"c": "Розклад навчального року: http://10.1.1.1:12042/general/year_schedule_2024_2025.png",
|
||||
"r": "Записи пар (5 семестр): http://10.1.1.1:12046/cgi/main-full.py",
|
||||
"d": "Навчальні дисципліни (5-8 семестри): http://10.1.1.1:12022/generic/disciplines-terms5-8.png",
|
||||
"d1": "Навчальні дисципліни (1-4 семестри): http://10.1.1.1:12022/generic/disciplines-terms1-4.png",
|
||||
"d2": "Навчальні дисципліни (5-8 семестри): http://10.1.1.1:12022/generic/disciplines-terms5-8.png",
|
||||
"h": "Стисла довідка:\n!s - головна сторінка сервера\n!u - універсальне посилання\n!r - записи пар (4 семестр)\n!c - календар навчального року\n!d - перелік навчальних дисциплін\n@all [повідомлення] - тег усіх користувачів\nПовна довідка: http://10.1.1.1:12032/generic/bot-help/short-help.html",
|
||||
"пари_для_артема": "🧐",
|
||||
"пари_для_артема_хоч_і_не_на_завтра": "🤨",
|
||||
"перекур": "😮\u200d💨",
|
||||
"fiot_free_vidrahuvannja": "😢",
|
||||
"світло": "⚡️"
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
command_storage = json.loads(open(self.path + "data.json").read())
|
||||
|
||||
received_command = self.MESSAGE.text[1:]
|
||||
|
||||
if received_command.lower() in command_storage:
|
||||
self.RESPONSE = command_storage[received_command.lower()]
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"version": 1,
|
||||
"index_file": "index.py",
|
||||
"start_on_boot": true,
|
||||
"alias": "generic-command-processor"
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
Usage: !hardsub [event_name]
|
||||
|
||||
Permanently subscribes to [event_name]. If blank, uses "default".
|
||||
To unsubscribe, use !hardunsub
|
||||
For one-time subscriptions, use !sub
|
|
@ -0,0 +1,5 @@
|
|||
Usage: !hardunsub [event_name]
|
||||
|
||||
Remove permanent subscription to [event_name]. If blank, uses "default".
|
||||
To remove one-time subscription, use !unsub
|
||||
To add permanent subscription, use !hardsub
|
|
@ -0,0 +1,5 @@
|
|||
Usage:
|
||||
!schedule-ctl list - see all settings
|
||||
!schedule-ctl get <setting> - see specific personal setting
|
||||
!schedule-ctl set <setting> <value> - change <setting> to <value>
|
||||
!schedule-ctl clear <setting> - restore <setting> to default value
|
|
@ -0,0 +1,7 @@
|
|||
Usage: !sub [event_name]
|
||||
|
||||
Soft-subscribes to [event_name]. If black, uses "default".
|
||||
If you want to remove soft substription, use !unsub
|
||||
|
||||
Soft subscription is automatically removed after the event is triggered once.
|
||||
If you want to subscribe permanently, use !hardsub
|
|
@ -0,0 +1,5 @@
|
|||
Usage: !unsub [event_name]
|
||||
|
||||
Removes one-time subscription to [event_name]. If blank, uses "default".
|
||||
Does not affect hard subscriptions. To remove hard subscription, use !hardunsub
|
||||
To add one-time supscription, use !sub
|
|
@ -0,0 +1,54 @@
|
|||
import json
|
||||
import os
|
||||
|
||||
module_path = ""
|
||||
|
||||
def readfile(filename):
|
||||
if os.path.exists(module_path + filename):
|
||||
return open(module_path + filename).read()
|
||||
else:
|
||||
return False
|
||||
|
||||
def list_entries(search_query):
|
||||
files = []
|
||||
for p, d, f in os.walk(module_path + "db/"):
|
||||
for i in f:
|
||||
entry_name = f"{p.split('/', 3)[3]}/{i}"
|
||||
if search_query in entry_name:
|
||||
files.append(f"{p.split('/', 3)[3]}/{i}".rsplit(".", 1)[0].replace("/", ".").lstrip("."))
|
||||
|
||||
files.sort()
|
||||
return files
|
||||
|
||||
def process(message, path):
|
||||
if message.text[:5] != "!help":
|
||||
return None, None
|
||||
|
||||
global module_path
|
||||
module_path = path
|
||||
|
||||
cmd = message.text[1:].split()
|
||||
|
||||
if len(cmd) == 1:
|
||||
return "Usage:\n```\n!help show <entry> - displays specified manual entry\n!help list [query] - lists out available entries (optionally, filtered by [query])```", "Markdown"
|
||||
|
||||
elif cmd[1] == "list":
|
||||
if len(cmd) == 2:
|
||||
return "Available entries:\n" + "\n".join(list_entries("")), None
|
||||
else:
|
||||
return f"Found entries for {cmd[2]}:\n" + "\n".join(list_entries(cmd[2])), None
|
||||
|
||||
elif cmd[1] == "show":
|
||||
if len(cmd) >= 3:
|
||||
result = ""
|
||||
for entry_name in cmd[2:]:
|
||||
data = readfile("db/" + entry_name.replace(".", "/") + ".txt")
|
||||
|
||||
if data:
|
||||
result += f"Manual page for {entry_name}:\n```\n{data}```\n"
|
||||
else:
|
||||
result += f"No manual found for {entry_name}\n\n"
|
||||
|
||||
return result, "Markdown"
|
||||
else:
|
||||
return "Usage: !help show <entry> - displays specified manual entry", None
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"start_on_boot": true,
|
||||
"alias": "help",
|
||||
"version": 2,
|
||||
"index_file": "index.py"
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
msg = self.MESSAGE.text.lower()
|
||||
|
||||
if msg == "!ping":
|
||||
current_time = time.time()
|
||||
delay = current_time - 7200 - float(self.MESSAGE.date.strftime('+%s'))
|
||||
self.RESPONSE = f"Pong in {delay} seconds"
|
||||
|
||||
if not os.path.exists(self.path + "scoreboard/"):
|
||||
os.mkdir(self.path + "scoreboard/")
|
||||
|
||||
def append_score(path, name, data):
|
||||
open(path + f"scoreboard/{name}", "a").write(data)
|
||||
|
||||
user_id = self.MESSAGE.from_user.id
|
||||
chat_id = self.MESSAGE.chat.id
|
||||
first_name = self.MESSAGE.from_user.first_name
|
||||
last_name = self.MESSAGE.from_user.last_name
|
||||
username = self.MESSAGE.from_user.username
|
||||
|
||||
append_score(self.path, self.MESSAGE.from_user.id, f"{current_time} {user_id} {chat_id} {first_name} {last_name} {username} {delay}\n")
|
||||
|
||||
elif msg == "!pong":
|
||||
current_time = time.time()
|
||||
delay = current_time - 7200 - float(self.MESSAGE.date.strftime('+%s'))
|
||||
self.RESPONSE = f"Ping in {delay} seconds"
|
||||
|
||||
if not os.path.exists(self.path + "pong-scoreboard/"):
|
||||
os.mkdir(self.path + "pong-scoreboard/")
|
||||
|
||||
def append_score(path, name, data):
|
||||
open(path + f"pong-scoreboard/{name}", "a").write(data)
|
||||
|
||||
user_id = self.MESSAGE.from_user.id
|
||||
chat_id = self.MESSAGE.chat.id
|
||||
first_name = self.MESSAGE.from_user.first_name
|
||||
last_name = self.MESSAGE.from_user.last_name
|
||||
username = self.MESSAGE.from_user.username
|
||||
|
||||
append_score(self.path, self.MESSAGE.from_user.id, f"{current_time} {user_id} {chat_id} {first_name} {last_name} {username} {delay}\n")
|
||||
|
||||
elif msg == "!pingtop":
|
||||
def read_score(path, name):
|
||||
if os.path.exists(path + f"scoreboard/{name}"):
|
||||
return open(path + f"scoreboard/{name}").read()
|
||||
else:
|
||||
return None
|
||||
|
||||
if not os.path.exists(self.path + "scoreboard/"):
|
||||
os.mkdir(self.path + "scoreboard/")
|
||||
|
||||
results = []
|
||||
for name in os.listdir(self.path + "scoreboard/"):
|
||||
data = [i for i in read_score(self.path, name).split("\n") if i != ""]
|
||||
data.sort(key = lambda x: float(x.split()[6]))
|
||||
results.append(data[0].split())
|
||||
|
||||
print(results)
|
||||
|
||||
results.sort(key = lambda x: float(x[6]))
|
||||
self.RESPONSE = "<u>Ping top</u>:\n" + "\n".join( [f"{i+1}. {v[3]} {v[4]} ({v[5]}) - {v[6]}" for i, v in enumerate(results[:10])] )
|
||||
self.FORMAT = "HTML"
|
||||
|
||||
elif msg == "!pongtop":
|
||||
def read_score(path, name):
|
||||
if os.path.exists(path + f"pong-scoreboard/{name}"):
|
||||
return open(path + f"pong-scoreboard/{name}").read()
|
||||
else:
|
||||
return None
|
||||
|
||||
if not os.path.exists(self.path + "pong-scoreboard/"):
|
||||
os.mkdir(self.path + "pong-scoreboard/")
|
||||
|
||||
results = []
|
||||
for name in os.listdir(self.path + "pong-scoreboard/"):
|
||||
data = [i for i in read_score(self.path, name).split("\n") if i != ""]
|
||||
data.sort(key = lambda x: float(x.split()[6]))
|
||||
results.append(data[0].split())
|
||||
|
||||
print(results)
|
||||
|
||||
results.sort(key = lambda x: float(x[6]))
|
||||
self.RESPONSE = "<u>Pong top</u>:\n" + "\n".join( [f"{i+1}. {v[3]} {v[4]} ({v[5]}) - {v[6]}" for i, v in enumerate(results[:10])] )
|
||||
self.FORMAT = "HTML"
|
||||
|
||||
elif msg == "!pingantitop":
|
||||
def read_score(path, name):
|
||||
if os.path.exists(path + f"scoreboard/{name}"):
|
||||
return open(path + f"scoreboard/{name}").read()
|
||||
else:
|
||||
return None
|
||||
|
||||
if not os.path.exists(self.path + "scoreboard/"):
|
||||
os.mkdir(self.path + "scoreboard/")
|
||||
|
||||
results = []
|
||||
for name in os.listdir(self.path + "scoreboard/"):
|
||||
data = [i for i in read_score(self.path, name).split("\n") if i != ""]
|
||||
data.sort(key = lambda x: float(x.split()[6]))
|
||||
results.append(data[-1].split())
|
||||
|
||||
print(results)
|
||||
|
||||
results.sort(key = lambda x: float(x[6]))
|
||||
results = results[::-1]
|
||||
self.RESPONSE = "<u>Ping antitop</u>:\n" + "\n".join( [f"{i+1}. {v[3]} {v[4]} ({v[5]}) - {v[6]}" for i, v in enumerate(results[:10])] )
|
||||
self.FORMAT = "HTML"
|
||||
|
||||
elif msg == "!pongantitop":
|
||||
def read_score(path, name):
|
||||
if os.path.exists(path + f"pong-scoreboard/{name}"):
|
||||
return open(path + f"pong-scoreboard/{name}").read()
|
||||
else:
|
||||
return None
|
||||
|
||||
if not os.path.exists(self.path + "pong-scoreboard/"):
|
||||
os.mkdir(self.path + "pong-scoreboard/")
|
||||
|
||||
results = []
|
||||
for name in os.listdir(self.path + "pong-scoreboard/"):
|
||||
data = [i for i in read_score(self.path, name).split("\n") if i != ""]
|
||||
data.sort(key = lambda x: float(x.split()[6]))
|
||||
results.append(data[-1].split())
|
||||
|
||||
print(results)
|
||||
|
||||
results.sort(key = lambda x: float(x[6]))
|
||||
results = results[::-1]
|
||||
self.RESPONSE = "<u>Pong antitop</u>:\n" + "\n".join( [f"{i+1}. {v[3]} {v[4]} ({v[5]}) - {v[6]}" for i, v in enumerate(results[:10])] )
|
||||
self.FORMAT = "HTML"
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"start_on_boot": true,
|
||||
"alias": "pingtools",
|
||||
"version": 1,
|
||||
"index_file": "index.py"
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"trigger_lists": [
|
||||
["fiot", "free", "sex"],
|
||||
["fict", "free", "sex"],
|
||||
["fice", "free", "sex"]
|
||||
],
|
||||
"response_text": "👀"
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
import random
|
||||
|
||||
module_path = ""
|
||||
|
||||
def extract_separators(text):
|
||||
sequence_buf = ""
|
||||
seps = []
|
||||
|
||||
for i in text:
|
||||
if i in ["\n", " "]:
|
||||
sequence_buf += i
|
||||
elif sequence_buf:
|
||||
seps.append(sequence_buf)
|
||||
sequence_buf = ""
|
||||
|
||||
return seps
|
||||
|
||||
def process(message, path):
|
||||
if not message.text.lower().startswith("!shuf"):
|
||||
return "", None
|
||||
|
||||
global module_path
|
||||
module_path = path
|
||||
|
||||
cmd = message.text.split()
|
||||
print(cmd)
|
||||
l = len(cmd)
|
||||
|
||||
# settings
|
||||
split_by = "word"
|
||||
shuf_individual_words = False
|
||||
data_source = "reply"
|
||||
only_spaces = False
|
||||
|
||||
shuf_data = []
|
||||
|
||||
i = 1
|
||||
|
||||
# parsing arguments
|
||||
while i < l:
|
||||
print("C", i, cmd[i])
|
||||
if cmd[i][0] != "-" or cmd[i] == "--":
|
||||
break
|
||||
elif cmd[i] == "-i":
|
||||
shuf_individual_words = True
|
||||
elif cmd[i] == "-c":
|
||||
split_by = "char"
|
||||
elif cmd[i] == "-o":
|
||||
only_spaces = True
|
||||
i += 1
|
||||
|
||||
# parsing text (if any)
|
||||
while i < l:
|
||||
print("T", i, cmd[i])
|
||||
data_source = "internal"
|
||||
if split_by == "char":
|
||||
for c in cmd[i]:
|
||||
shuf_data.append(c)
|
||||
shuf_data.append(" ")
|
||||
elif split_by == "word":
|
||||
if shuf_individual_words:
|
||||
shuf_data.append(list(cmd[i]))
|
||||
else:
|
||||
shuf_data.append(cmd[i])
|
||||
|
||||
i += 1
|
||||
|
||||
if data_source == "reply":
|
||||
seps = extract_separators(message['reply_to_message'].text)
|
||||
else:
|
||||
seps = extract_separators(message.text)
|
||||
|
||||
if data_source == "reply":
|
||||
for w in message['reply_to_message'].text.split():
|
||||
if split_by == "char":
|
||||
for c in w:
|
||||
shuf_data.append(c)
|
||||
elif split_by == "word":
|
||||
if shuf_individual_words:
|
||||
shuf_data.append(list(w))
|
||||
else:
|
||||
shuf_data.append(w)
|
||||
|
||||
if split_by == "word":
|
||||
if shuf_individual_words:
|
||||
for w in shuf_data:
|
||||
random.shuffle(w)
|
||||
|
||||
if only_spaces:
|
||||
return " ".join(["".join(w) for w in shuf_data]), "HTML"
|
||||
else:
|
||||
return "".join([i[0] + i[1] for i in zip(["".join(w) for w in shuf_data], seps)]) + "".join(shuf_data[-1]), "HTML"
|
||||
else:
|
||||
random.shuffle(shuf_data)
|
||||
|
||||
if only_spaces:
|
||||
return " ".join(shuf_data), "HTML"
|
||||
else:
|
||||
return "".join([i[0] + i[1] for i in zip(shuf_data, seps)]) + shuf_data[-1], "HTML"
|
||||
elif split_by == "char":
|
||||
if only_spaces:
|
||||
shuf_data += [" " for i in seps]
|
||||
else:
|
||||
shuf_data += seps
|
||||
|
||||
random.shuffle(shuf_data)
|
||||
return "".join(shuf_data), "HTML"
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"start_on_boot": true,
|
||||
"alias": "shuffle",
|
||||
"version": 2,
|
||||
"index_file": "index.py"
|
||||
}
|
|
@ -0,0 +1,133 @@
|
|||
import os
|
||||
import json
|
||||
|
||||
def setup():
|
||||
for i in ["sub-storage"]:
|
||||
if not os.path.exists(module_path + i):
|
||||
os.mkdir(module_path + i)
|
||||
|
||||
def load_group(group_name):
|
||||
if os.path.exists(module_path + f"sub-storage/{group_name}.json"):
|
||||
return json.loads(open(module_path + f"sub-storage/{group_name}.json").read())
|
||||
else:
|
||||
return {"hard": [], "soft": []}
|
||||
|
||||
def save_group(group_name, existing_group):
|
||||
with open(module_path + f"sub-storage/{group_name}.json", "w") as f:
|
||||
f.write(json.dumps(existing_group))
|
||||
|
||||
def sub_to_group(group_name, tag, persistence = "soft"):
|
||||
for i in ["..", "/", "\\"]:
|
||||
if i in group_name:
|
||||
return False
|
||||
|
||||
existing_group = load_group(group_name)
|
||||
|
||||
if tag not in existing_group[persistence]:
|
||||
existing_group[persistence].append(tag)
|
||||
|
||||
save_group(group_name, existing_group)
|
||||
|
||||
return True
|
||||
|
||||
def unsub_from_group(group_name, tag, persistence = "soft"):
|
||||
for i in ["..", "/", "\\"]:
|
||||
if i in group_name:
|
||||
return False
|
||||
|
||||
existing_group = load_group(group_name)
|
||||
|
||||
if tag in existing_group[persistence]:
|
||||
existing_group[persistence].remove(tag)
|
||||
|
||||
save_group(group_name, existing_group)
|
||||
|
||||
return True
|
||||
|
||||
def get_group(cmd):
|
||||
if len(cmd) == 1:
|
||||
return "default"
|
||||
else:
|
||||
return cmd[1]
|
||||
|
||||
def clear_subs_in(group_name, category = "soft"):
|
||||
existing_group = load_group(group_name)
|
||||
existing_group[category] = []
|
||||
save_group(group_name, existing_group)
|
||||
|
||||
module_path = ""
|
||||
setup()
|
||||
|
||||
def process(message, path):
|
||||
global module_path
|
||||
module_path = path
|
||||
|
||||
if not message.text[0] == "!":
|
||||
return "", None
|
||||
|
||||
msg = message.text.lower()
|
||||
cmd = [i for i in msg[1:].split(" ", 2) if i]
|
||||
|
||||
chosen_group_name = get_group(cmd)
|
||||
|
||||
if cmd[0] == "sub":
|
||||
if message.from_user.username:
|
||||
if sub_to_group(chosen_group_name, message.from_user.username):
|
||||
return f"Subscribed {message.from_user.username} to the {chosen_group_name} event", None
|
||||
else:
|
||||
return f"Failed to subscribe {message.from_user.username} to the \"{chosen_group_name}\" event (event name violation)", None
|
||||
else:
|
||||
return f"Failed to subscribe {message.from_user.id} to the \"{chosen_group_name}\" event (no username available)", None
|
||||
|
||||
if cmd[0] == "hardsub":
|
||||
if message.from_user.username:
|
||||
if sub_to_group(chosen_group_name, message.from_user.username, persistence = "hard"):
|
||||
return f"Hard-subscribed {message.from_user.username} to the {chosen_group_name} event", None
|
||||
else:
|
||||
return f"Failed to hard-subscribe {message.from_user.username} to the \"{chosen_group_name}\" event (event name violation)", None
|
||||
else:
|
||||
return f"Failed to hard-subscribe {message.from_user.id} to the \"{chosen_group_name}\" event (no username available)", None
|
||||
|
||||
elif cmd[0] == "unsub":
|
||||
if message.from_user.username:
|
||||
if unsub_from_group(chosen_group_name, message.from_user.username):
|
||||
return f"Unsubscribed {message.from_user.username} from the {chosen_group_name} event", None
|
||||
else:
|
||||
return f"Failed to unsubscribe {message.from_user.username} from the \"{chosen_group_name}\" event (event name violation)", None
|
||||
else:
|
||||
return f"Failed to unsubscribe {message.from_user.id} from the \"{chosen_group_name}\" event (no username available)", None
|
||||
|
||||
elif cmd[0] == "hardunsub":
|
||||
if message.from_user.username:
|
||||
if unsub_from_group(chosen_group_name, message.from_user.username, persistence = "hard"):
|
||||
return f"Unsubscribed {message.from_user.username} from the {chosen_group_name} event", None
|
||||
else:
|
||||
return f"Failed to unsubscribe {message.from_user.username} from the \"{chosen_group_name}\" event (event name violation)", None
|
||||
else:
|
||||
return f"Failed to unsubscribe {message.from_user.id} from the \"{chosen_group_name}\" event (no username available)", None
|
||||
|
||||
elif cmd[0] == "call":
|
||||
group_data = load_group(chosen_group_name)
|
||||
tags = set()
|
||||
|
||||
for subs in group_data.values():
|
||||
tags |= set([f"@{i}" for i in subs if i])
|
||||
|
||||
ping_string = " ".join(tags)
|
||||
clear_subs_in(chosen_group_name)
|
||||
|
||||
if len(cmd) == 3:
|
||||
return f"{message.from_user.username} calls \"{chosen_group_name}\": {cmd[2]}\n{ping_string}", None
|
||||
else:
|
||||
return f"{message.from_user.username} calls \"{chosen_group_name}\"\n{ping_string}", None
|
||||
|
||||
|
||||
elif cmd[0] == "sublist":
|
||||
group_data = load_group(chosen_group_name)
|
||||
responce = f"Subscribers for group \"{chosen_group_name}\":\n"
|
||||
|
||||
for name, subs in group_data.items():
|
||||
responce += f"{name}: {', '.join(subs)}\n"
|
||||
|
||||
return responce, None
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"start_on_boot": true,
|
||||
"alias": "tag-sub",
|
||||
"version": 2,
|
||||
"index_file": "index.py"
|
||||
}
|
|
@ -22,7 +22,7 @@ if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
|||
"target": target,
|
||||
"format": "text"}
|
||||
|
||||
res = requests.post("http://127.0.0.1:5000/translate", data = data)
|
||||
res = requests.post("http://10.1.1.1:5010/translate", data = data)
|
||||
result = json.loads(res.text)
|
||||
|
||||
if source == "auto":
|
||||
|
|
|
@ -4,8 +4,14 @@ 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}")
|
||||
escaping_rules = {
|
||||
"<": "<",
|
||||
">": ">",
|
||||
'"': """
|
||||
}
|
||||
|
||||
for i in escaping_rules.items():
|
||||
result_string = result_string.replace(i[0], i[1])
|
||||
|
||||
return result_string
|
||||
|
||||
|
@ -31,7 +37,7 @@ if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
|||
f"{', '.join(list(models.keys()))}"
|
||||
else:
|
||||
for i in models[chosen_model]:
|
||||
decoded_text = decoded_text.replace(i[0], i[1])
|
||||
decoded_text = decoded_text.replace(i[0].lower(), i[1].lower())
|
||||
decoded_text = decoded_text.replace(i[0].capitalize(), i[1].capitalize())
|
||||
decoded_text = decoded_text.replace(i[0].upper(), i[1].upper())
|
||||
|
||||
|
|
|
@ -75,5 +75,57 @@
|
|||
["$", ";"],
|
||||
["^", ":"],
|
||||
["&", "?"]
|
||||
],
|
||||
"en-men": [
|
||||
["a", "4"],
|
||||
["b", "8"],
|
||||
["c", "("],
|
||||
["d", "|)"],
|
||||
["e", "3"],
|
||||
["f", "|="],
|
||||
["g", "6"],
|
||||
["h", "#"],
|
||||
["i", "!"],
|
||||
["j", "|_"],
|
||||
["k", "|<"],
|
||||
["l", "1"],
|
||||
["m", "//N"],
|
||||
["o", "0"],
|
||||
["p", "|D"],
|
||||
["q", "(,)"],
|
||||
["r", "|2"],
|
||||
["s", "5"],
|
||||
["t", "7"],
|
||||
["u", "|_|"],
|
||||
["w", "//"],
|
||||
["v", "/"],
|
||||
["x", "><"],
|
||||
["y", "`/"]
|
||||
],
|
||||
"men-en": [
|
||||
["4", "a"],
|
||||
["8", "b"],
|
||||
["(,)", "q"],
|
||||
["(", "c"],
|
||||
["|)", "d"],
|
||||
["3", "e"],
|
||||
["|=", "f"],
|
||||
["6", "g"],
|
||||
["#", "h"],
|
||||
["!", "i"],
|
||||
["|_|", "u"],
|
||||
["|_", "j"],
|
||||
["|<", "k"],
|
||||
["1", "l"],
|
||||
["//N", "m"],
|
||||
["0", "o"],
|
||||
["|D", "p"],
|
||||
["|2", "r"],
|
||||
["5", "s"],
|
||||
["7", "t"],
|
||||
["//", "w"],
|
||||
["`/", "y"],
|
||||
["/", "v"],
|
||||
["><", "x"]
|
||||
]
|
||||
}
|
||||
|
|
|
@ -0,0 +1,124 @@
|
|||
import re
|
||||
|
||||
''' Grammar reference
|
||||
all_possible_match_strings = [
|
||||
"силка", "силки",
|
||||
"силки", "силок",
|
||||
"силці", "силкам",
|
||||
"силку", "силки",
|
||||
"силкою", "силками",
|
||||
"силці", "силках",
|
||||
"силко", "силки",
|
||||
|
||||
"лінк", "лінка", "лінки",
|
||||
"лінку", "лінки", "лінок",
|
||||
"лінку", "лінці", "лінкам",
|
||||
"лінк", "лінку", "лінки",
|
||||
"лінком", "лінкою", "лінками",
|
||||
"лінку", "лінці", "лінках",
|
||||
"лінке", "лінко", "лінки"
|
||||
]
|
||||
'''
|
||||
|
||||
EXTRACT_PADDING = 11
|
||||
EXTRACT_INCLUDE_WHOLE_WORDS = True
|
||||
|
||||
corrections = [ # IDs
|
||||
"посилання", # 0
|
||||
"посиланню", # 1
|
||||
"посиланням", # 2
|
||||
"на посиланні", # 3
|
||||
"посилань", # 4
|
||||
"посиланнями", # 5
|
||||
"посиланнях" # 6
|
||||
]
|
||||
|
||||
replacements = [
|
||||
["силка", "силки", "силку", "силко",
|
||||
"лінк", "лінка", "лінки", "лінку", "лінке", "лінко"],
|
||||
["силці",
|
||||
"лінку", "лінці"],
|
||||
["силкам", "силкою",
|
||||
"лінкам", "лінком", "лінкою"],
|
||||
["на силці",
|
||||
"на лінку", "на лінці"],
|
||||
["силок",
|
||||
"лінок"],
|
||||
["силками",
|
||||
"лінками"],
|
||||
["силках",
|
||||
"лінках"]
|
||||
]
|
||||
|
||||
#unique_match_strings = set(all_possible_match_strings)
|
||||
|
||||
#ua_alphabet = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя"
|
||||
#regex_matchers = [re.compile(fr"((?<=[^{ua_alphabet}])|(?<=\b)|(?<=^)|(?<= )){i}((?=[^{ua_alphabet}])|(?=\b)|(?=$)|(?= ))", re.DEBUG)
|
||||
# for i in unique_match_strings]
|
||||
|
||||
ua_alphabet = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя"
|
||||
|
||||
for i, group in enumerate(replacements):
|
||||
for j, match_word in enumerate(group):
|
||||
#replacements[i][j] = re.compile(fr"((?<=[^{ua_alphabet}])|(?<=\b)|(?<=^)|(?<= )){i}((?=[^{ua_alphabet}])|(?=\b)|(?=$)|(?= ))")
|
||||
replacements[i][j] = [match_word, re.compile(fr"((?<=[^{ua_alphabet}])|(?<=\b)|(?<=^)|(?<= )){match_word}((?=[^{ua_alphabet}])|(?=\b)|(?=$)|(?= ))")]
|
||||
#print(replacements[i][j])
|
||||
|
||||
#_ = [print(fr"(?<=[^абвгґдеєжзиіїйклмнопрстуфхцчшщьюя]){i}(?=[^абвгґдеєжзиіїйклмнопрстуфхцчшщьюя])") for i in unique_match_strings]
|
||||
|
||||
def process(message, path):
|
||||
lowercase_message = message.text.lower()
|
||||
|
||||
for correct_word_id, group in enumerate(replacements):
|
||||
for match_word, matcher in group:
|
||||
result = matcher.search(lowercase_message)
|
||||
|
||||
if result:
|
||||
l = len(message.text)
|
||||
|
||||
mistake_start = result.start()
|
||||
mistake_end = result.end()
|
||||
|
||||
print(mistake_start, mistake_end)
|
||||
|
||||
original_text_before = message.text[max(mistake_start-EXTRACT_PADDING,0):mistake_start]
|
||||
original_text_after = message.text[mistake_end:min(mistake_end+EXTRACT_PADDING,l)]
|
||||
original_text_mistake = message.text[mistake_start:mistake_end]
|
||||
|
||||
if EXTRACT_INCLUDE_WHOLE_WORDS:
|
||||
while 0 <= mistake_start - EXTRACT_PADDING - 1 < l and \
|
||||
message.text[mistake_start-EXTRACT_PADDING-1].isalnum():
|
||||
mistake_start -= 1
|
||||
original_text_before = message.text[max(mistake_start-EXTRACT_PADDING,0):result.start()]
|
||||
|
||||
while 0 <= mistake_end + EXTRACT_PADDING < l and \
|
||||
message.text[mistake_end+EXTRACT_PADDING].isalnum():
|
||||
mistake_end += 1
|
||||
original_text_after = message.text[result.end():min(mistake_end+EXTRACT_PADDING,l)]
|
||||
|
||||
|
||||
if len(message.text[:mistake_start]) > EXTRACT_PADDING:
|
||||
original_text_before_continue = "..."
|
||||
else:
|
||||
original_text_before_continue = ""
|
||||
|
||||
if len(message.text[mistake_end:]) > EXTRACT_PADDING:
|
||||
original_text_after_continue = "..."
|
||||
else:
|
||||
original_text_after_continue = ""
|
||||
|
||||
original_extract = original_text_before_continue + original_text_before \
|
||||
+ original_text_mistake + original_text_after + original_text_after_continue
|
||||
|
||||
correct_word = corrections[correct_word_id]
|
||||
if original_text_mistake == match_word.capitalize():
|
||||
correct_word = corrections[correct_word_id].capitalize()
|
||||
elif original_text_mistake == match_word.upper():
|
||||
correct_word = corrections[correct_word_id].upper()
|
||||
|
||||
fixed_extract = original_text_before_continue + original_text_before \
|
||||
+ correct_word + original_text_after + original_text_after_continue
|
||||
|
||||
return f'"{original_extract}" -> "{fixed_extract}" 🌚', None
|
||||
else:
|
||||
return "", None
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"start_on_boot": false,
|
||||
"alias": "troll-spelling-corrector",
|
||||
"version": 2,
|
||||
"index_file": "index.py"
|
||||
}
|
Loading…
Reference in New Issue