forked from dymik739/modular-bot-framework-for-telegram
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8cc68080e8 | |||
| 94275048bb | |||
| 1504e03e13 | |||
| 87424c8786 | |||
| b21b16b817 | |||
| 12ee02cee0 | |||
| ba353a3609 | |||
| 69cb179d87 | |||
| 1bd7fc2ef1 | |||
| 535087fae1 | |||
| e8a61a9e36 | |||
| 5d7f89cff0 | |||
| 763cc4d131 | |||
| bd22e8e9b6 | |||
| 44628a3021 | |||
| 72c5b0b4a9 | |||
| efac73776f | |||
| d1f7019f89 | |||
| 8debb0b3d5 | |||
| 2206bf6319 | |||
| 38d8674bbd | |||
| 7bca26e07c | |||
| 1f9212c033 | |||
| d0cd483b73 | |||
| edfcc6e1be | |||
| 56e57c4d7f | |||
| ae1225ceee | |||
| bf79f3903d | |||
| 59b547d9fa |
@@ -11,16 +11,18 @@ import importlib
|
||||
# global variables
|
||||
STOP_REQUESTED = False
|
||||
|
||||
|
||||
# some functions that increase readability of the code
|
||||
def readfile(filename):
|
||||
try:
|
||||
return codecs.open(filename, encoding = "utf-8").read()
|
||||
return codecs.open(filename, encoding="utf-8").read()
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
except Exception as e:
|
||||
print( "[ERROR] Unexpected error occured in readfile() ({0})".format(e) )
|
||||
print(f"[ERROR] Unexpected error occurred in readfile() ({e})")
|
||||
return False
|
||||
|
||||
|
||||
# module object classes
|
||||
class ModuleV1:
|
||||
def __init__(self, path, code, enabled, alias, predefine):
|
||||
@@ -36,13 +38,14 @@ class ModuleV1:
|
||||
|
||||
# set environmental variables
|
||||
def set_env(self):
|
||||
self.RESPONCE = ""
|
||||
self.RESPONSE = ""
|
||||
|
||||
def set_predefine(self):
|
||||
try:
|
||||
exec(self.predefine)
|
||||
except Exception as e:
|
||||
print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e))
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\" "
|
||||
f"during predefine stage, disabling it...")
|
||||
|
||||
# running the module
|
||||
def process(self, msg):
|
||||
@@ -51,11 +54,12 @@ class ModuleV1:
|
||||
self.MESSAGE = msg
|
||||
try:
|
||||
exec(self.code)
|
||||
return self.RESPONCE
|
||||
return self.RESPONSE
|
||||
except Exception as e:
|
||||
print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e))
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return ""
|
||||
|
||||
|
||||
class ModuleV2:
|
||||
def __init__(self, path, index_file, enabled, alias):
|
||||
self.version = 2
|
||||
@@ -68,8 +72,7 @@ class ModuleV2:
|
||||
# running the module
|
||||
def process(self, msg):
|
||||
try:
|
||||
responce = self.obj.process(msg, self.path)
|
||||
return responce
|
||||
return self.obj.process(msg, self.path)
|
||||
except Exception as e:
|
||||
print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return None
|
||||
@@ -88,7 +91,7 @@ class ModuleControlUnit:
|
||||
try:
|
||||
meta_raw = readfile("modules/{}/meta.json".format(folder))
|
||||
if not meta_raw:
|
||||
print("[WARN] module_loader: no meta.json found in module folder \"{}\"".format(folder))
|
||||
print(f"[WARN] module_loader: no meta.json found in module folder \"{folder}\"")
|
||||
continue
|
||||
|
||||
meta = json.loads( meta_raw )
|
||||
@@ -119,9 +122,10 @@ class ModuleControlUnit:
|
||||
else:
|
||||
predefine = False
|
||||
|
||||
self.modules.append( ModuleV1( "modules/{}/".format(folder), code, enabled, alias, predefine ) )
|
||||
self.modules.append(ModuleV1(f"modules/{folder}/", code, enabled, alias, predefine))
|
||||
|
||||
print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder, alias, enabled))
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} "
|
||||
f"(start_on_boot: {enabled})")
|
||||
|
||||
elif meta["version"] == 2:
|
||||
if "index_file" in meta:
|
||||
@@ -141,19 +145,15 @@ class ModuleControlUnit:
|
||||
|
||||
self.modules.append(ModuleV2(f"modules/{folder}/", index_file, enabled, alias))
|
||||
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} (start_on_boot: {enabled})")
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} "
|
||||
f"(start_on_boot: {enabled})")
|
||||
|
||||
else:
|
||||
print(f"[WARN] reload_modules: module {folder} requires unsupported version ({meta['version']} > 2), skipping...")
|
||||
print(f"[WARN] reload_modules: module {folder} requires unsupported version "
|
||||
f"({meta['version']} > 2), skipping...")
|
||||
|
||||
except Exception as e:
|
||||
print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder, e))
|
||||
|
||||
# message queue object to go back to synchronous message processing
|
||||
#class MessageQueue:
|
||||
# def __init__(self):
|
||||
# print("[INFO] Initializing the message queue...")
|
||||
# self.queue = []
|
||||
print(f"[ERROR] module_loader: error while loading module \"{folder}\" ({e})")
|
||||
|
||||
|
||||
# synchronous message processor
|
||||
@@ -188,10 +188,18 @@ def queue_processor():
|
||||
for mod in mcu.modules:
|
||||
if mod.enabled:
|
||||
if mod.version == 1 or mod.version == 2:
|
||||
responce = mod.process(msg)
|
||||
if responce:
|
||||
updater.bot.send_message(chat_id = msg.chat.id, text = responce, disable_web_page_preview = True)
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {responce}")
|
||||
response = mod.process(msg)
|
||||
|
||||
if response:
|
||||
# protecting output
|
||||
symbols_to_escape = ['[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
|
||||
for symbol in symbols_to_escape:
|
||||
response = response.replace(symbol, f"\\{symbol}")
|
||||
|
||||
updater.bot.send_message(chat_id=msg.chat.id, text=response,
|
||||
disable_web_page_preview=True,
|
||||
parse_mode="MarkdownV2")
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
break
|
||||
|
||||
del message_queue[0]
|
||||
@@ -203,8 +211,8 @@ def queue_processor():
|
||||
else:
|
||||
time.sleep(1)
|
||||
except Exception as e:
|
||||
print("[ERROR] queue_processor: current message queue: {}".format(message_queue))
|
||||
print("[ERROR] queue_processor: error while processing message, trying to delete it...")
|
||||
print(f"[ERROR] queue_processor: current message queue: {message_queue}")
|
||||
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")
|
||||
@@ -229,7 +237,7 @@ message_queue = []
|
||||
|
||||
mcu = ModuleControlUnit()
|
||||
|
||||
processor_thread = threading.Thread( target = queue_processor, args = [] )
|
||||
processor_thread = threading.Thread(target=queue_processor, args=[])
|
||||
processor_thread.start()
|
||||
|
||||
|
||||
@@ -241,7 +249,7 @@ if not TOKEN:
|
||||
sys.exit(1)
|
||||
|
||||
# connect to Telegram servers
|
||||
updater = Updater(TOKEN, use_context = True)
|
||||
updater = Updater(TOKEN, use_context=True)
|
||||
dispatcher = updater.dispatcher
|
||||
|
||||
# assign the handler for messages
|
||||
|
||||
+28
-31
@@ -12,16 +12,18 @@ from telegram import Message, Chat
|
||||
# global variables
|
||||
STOP_REQUESTED = False
|
||||
|
||||
|
||||
# some functions that increase readability of the code
|
||||
def readfile(filename):
|
||||
try:
|
||||
return codecs.open(filename, encoding = "utf-8").read()
|
||||
return codecs.open(filename, encoding="utf-8").read()
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
except Exception as e:
|
||||
print( "[ERROR] Unexpected error occured in readfile() ({0})".format(e) )
|
||||
print(f"[ERROR] Unexpected error occurred in readfile() ({e})")
|
||||
return False
|
||||
|
||||
|
||||
# module object classes
|
||||
class ModuleV1:
|
||||
def __init__(self, path, code, enabled, alias, predefine):
|
||||
@@ -37,13 +39,14 @@ class ModuleV1:
|
||||
|
||||
# set environmental variables
|
||||
def set_env(self):
|
||||
self.RESPONCE = ""
|
||||
self.RESPONSE = ""
|
||||
|
||||
def set_predefine(self):
|
||||
try:
|
||||
exec(self.predefine)
|
||||
except Exception as e:
|
||||
print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e))
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\" "
|
||||
f"during predefine stage, disabling it...")
|
||||
|
||||
# running the module
|
||||
def process(self, msg):
|
||||
@@ -52,9 +55,9 @@ class ModuleV1:
|
||||
self.MESSAGE = msg
|
||||
try:
|
||||
exec(self.code)
|
||||
return self.RESPONCE
|
||||
return self.RESPONSE
|
||||
except Exception as e:
|
||||
print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e))
|
||||
print(f"[ERROR] module v1: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"")
|
||||
return ""
|
||||
|
||||
|
||||
@@ -90,10 +93,10 @@ class ModuleControlUnit:
|
||||
try:
|
||||
meta_raw = readfile("modules/{}/meta.json".format(folder))
|
||||
if not meta_raw:
|
||||
print("[WARN] module_loader: no meta.json found in module folder \"{}\"".format(folder))
|
||||
print(f"[WARN] module_loader: no meta.json found in module folder \"{folder}\"")
|
||||
continue
|
||||
|
||||
meta = json.loads( meta_raw )
|
||||
meta = json.loads(meta_raw)
|
||||
if "version" in meta:
|
||||
if meta["version"] == 1:
|
||||
if "index_file" in meta:
|
||||
@@ -101,9 +104,9 @@ class ModuleControlUnit:
|
||||
else:
|
||||
index_file = "index.py"
|
||||
|
||||
code = readfile( "modules/{}/{}".format(folder, index_file) )
|
||||
code = readfile("modules/{}/{}".format(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:
|
||||
@@ -121,9 +124,10 @@ class ModuleControlUnit:
|
||||
else:
|
||||
predefine = False
|
||||
|
||||
self.modules.append( ModuleV1( "modules/{}/".format(folder), code, enabled, alias, predefine ) )
|
||||
self.modules.append(ModuleV1(f"modules/{folder}/", code, enabled, alias, predefine))
|
||||
|
||||
print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder, alias, enabled))
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} "
|
||||
f"(start_on_boot: {enabled})")
|
||||
|
||||
elif meta["version"] == 2:
|
||||
if "index_file" in meta:
|
||||
@@ -143,21 +147,15 @@ class ModuleControlUnit:
|
||||
|
||||
self.modules.append(ModuleV2(f"modules/{folder}/", index_file, enabled, alias))
|
||||
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} (start_on_boot: {enabled})")
|
||||
print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} "
|
||||
f"(start_on_boot: {enabled})")
|
||||
|
||||
else:
|
||||
print(f"[WARN] reload_modules: module {folder} requires unsupported version ({meta['version']} > 2), skipping...")
|
||||
print(f"[WARN] reload_modules: module {folder} requires unsupported version "
|
||||
f"({meta['version']} > 2), skipping...")
|
||||
|
||||
except Exception as e:
|
||||
print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder, e))
|
||||
|
||||
|
||||
# message queue object to go back to synchronous message processing
|
||||
#class MessageQueue:
|
||||
# def __init__(self):
|
||||
# print("[INFO] Initializing the message queue...")
|
||||
# self.queue = []
|
||||
|
||||
print(f"[ERROR] module_loader: error while loading module \"{folder}\" ({e})")
|
||||
|
||||
# synchronous message processor
|
||||
def queue_processor():
|
||||
@@ -191,9 +189,9 @@ def queue_processor():
|
||||
for mod in mcu.modules:
|
||||
if mod.enabled:
|
||||
if mod.version == 1 or mod.version == 2:
|
||||
responce = mod.process(msg)
|
||||
if responce:
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {responce}")
|
||||
response = mod.process(msg)
|
||||
if response:
|
||||
print(f"Responded using module {mod.path} ({mod.alias}) with text: {response}")
|
||||
break
|
||||
|
||||
del message_queue[0]
|
||||
@@ -203,8 +201,8 @@ def queue_processor():
|
||||
else:
|
||||
time.sleep(1)
|
||||
|
||||
except Exception as e:
|
||||
print("[ERROR] queue_processor: current message queue: {}".format(message_queue))
|
||||
except Exception:
|
||||
print(f"[ERROR] queue_processor: current message queue: {message_queue}")
|
||||
print("[ERROR] queue_processor: error while processing message, trying to delete it...")
|
||||
try:
|
||||
del message_queue[0]
|
||||
@@ -224,10 +222,9 @@ message_queue = []
|
||||
|
||||
mcu = ModuleControlUnit()
|
||||
|
||||
processor_thread = threading.Thread( target = queue_processor, args = [] )
|
||||
processor_thread = threading.Thread(target=queue_processor, args=[])
|
||||
processor_thread.start()
|
||||
|
||||
|
||||
print("Enter testing messages one by one, end with an empty line")
|
||||
|
||||
while True:
|
||||
@@ -235,4 +232,4 @@ while True:
|
||||
if len(new_msg) == 0:
|
||||
break
|
||||
|
||||
message_queue.append(Message(9, round(time.time()), Chat(575246355, 'supergroup'), text = new_msg))
|
||||
message_queue.append(Message(9, round(time.time()), Chat(575246355, 'supergroup'), text=new_msg))
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
../auto-schedule-pro/additions.json
|
||||
@@ -0,0 +1,183 @@
|
||||
from datetime import datetime
|
||||
import json
|
||||
|
||||
|
||||
def readfile(filename):
|
||||
with open(module_path + filename) as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
# global constants
|
||||
# Accusative - znahidnyj
|
||||
WEEKDAYS_ACCUSATIVE = ["понеділок", "вівторок", "середу", "четвер", "п'ятницю", "суботу", "неділю"]
|
||||
# Genitive - rodovyj
|
||||
WEEKDAYS_GENITIVE_NEXT = ["наступного понеділка", "наступного вівторка", "наступної середи", "наступного четверга",
|
||||
"наступної п'ятниці", "наступної суботи", "наступної неділі"]
|
||||
|
||||
WEEKDAYS_GENITIVE_THIS = ["цього понеділка", "цього вівторка", "цієї середи", "цього четверга", "цієї п'ятниці",
|
||||
"цієї суботи", "цієї неділі"]
|
||||
|
||||
# global variables
|
||||
module_path = ""
|
||||
|
||||
|
||||
def get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week):
|
||||
human_readable_date = ""
|
||||
if ((current_day + 2) == int(start_datetime.strftime("%u"))) or \
|
||||
((current_day == 6) and (start_datetime.strftime("%u") == "1")):
|
||||
human_readable_date += "завтра "
|
||||
elif current_week != int(start_datetime.strftime("%W")) % 2:
|
||||
human_readable_date += f"{WEEKDAYS_GENITIVE_NEXT[int(start_datetime.strftime('%u')) - 1]} "
|
||||
elif current_day != (int(start_datetime.strftime("%u")) - 1):
|
||||
human_readable_date += f"{WEEKDAYS_GENITIVE_THIS[int(start_datetime.strftime('%u')) - 1]} "
|
||||
else:
|
||||
human_readable_date += "сьогодні "
|
||||
|
||||
human_readable_date += "з "
|
||||
human_readable_date += start_datetime.strftime("%H:%M")
|
||||
|
||||
human_readable_date += " до "
|
||||
human_readable_date += end_datetime.strftime("%H:%M")
|
||||
|
||||
return human_readable_date
|
||||
|
||||
|
||||
def generate_lesson_description(lesson, start_datetime, end_datetime, current_day, current_week, overrides={}):
|
||||
output_settings = {"name": True, "date": True, "teacher": True, "link": True}
|
||||
output_settings.update(overrides)
|
||||
|
||||
result = ""
|
||||
|
||||
if output_settings['name']:
|
||||
result += f"{lesson['name']}\n"
|
||||
|
||||
if output_settings['date']:
|
||||
human_readable_date = get_human_readable_date(start_datetime, end_datetime,
|
||||
current_day, current_week)
|
||||
result += f"*Дата*: {human_readable_date}\n"
|
||||
|
||||
if output_settings['teacher']:
|
||||
result += f"*Викладач*: {lesson['teacher']}\n"
|
||||
|
||||
if output_settings['link']:
|
||||
result += f"*Посилання*: {lesson['link']}"
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_schedule_data_from(filename):
|
||||
raw_schedule = json.loads(readfile(filename))
|
||||
|
||||
baked_schedule = {}
|
||||
|
||||
for day_number, lesson_times in enumerate(raw_schedule):
|
||||
for lesson_time in lesson_times:
|
||||
timestamp = day_number * 86400 + int(lesson_time.split(":")[0]) * 3600 \
|
||||
+ int(lesson_time.split(":")[1]) * 60
|
||||
|
||||
new_record = dict(raw_schedule[day_number][lesson_time])
|
||||
new_record["source"] = filename.split(".json")[0]
|
||||
baked_schedule[timestamp] = new_record
|
||||
|
||||
return baked_schedule
|
||||
|
||||
|
||||
def process_arguments(args, base_day):
|
||||
selected_day = int(base_day)
|
||||
preferences = {}
|
||||
|
||||
for arg in args:
|
||||
if arg[0] == "-":
|
||||
if arg[1:].isdigit():
|
||||
selected_day -= int(arg[1:])
|
||||
else:
|
||||
preferences[arg[1:]] = False
|
||||
|
||||
elif arg[0] == "+":
|
||||
if arg[1:].isdigit():
|
||||
selected_day += int(arg[1:])
|
||||
else:
|
||||
preferences[arg[1:]] = True
|
||||
|
||||
selected_day = selected_day % 14
|
||||
|
||||
return preferences, selected_day
|
||||
|
||||
|
||||
def get_lesson_description(schedule, reference_time, lesson_time, current_day, current_week, overrides={}):
|
||||
lesson_record = schedule[lesson_time]
|
||||
|
||||
lesson_start_datetime = datetime.fromtimestamp(reference_time + lesson_time)
|
||||
lesson_end_datetime = datetime.fromtimestamp(reference_time + lesson_time + 5400)
|
||||
|
||||
return generate_lesson_description(lesson_record, lesson_start_datetime, lesson_end_datetime, current_day,
|
||||
current_week, overrides=overrides)
|
||||
|
||||
|
||||
def process(message, path):
|
||||
message_text = message["text"]
|
||||
full_command = message_text.split()
|
||||
|
||||
# there is no need to check if the full_command list if empty as it
|
||||
# never will be - Telegram requires all messages to have at least
|
||||
# one printable symbol, so this is already protected
|
||||
base_command = full_command[0].lower()
|
||||
|
||||
if base_command not in ["!пара", "!пари"]:
|
||||
return ""
|
||||
|
||||
global module_path
|
||||
module_path = path
|
||||
|
||||
schedule = get_schedule_data_from("schedule.json")
|
||||
schedule.update(get_schedule_data_from("additions.json"))
|
||||
|
||||
current_time = datetime.now()
|
||||
|
||||
current_week = current_time.isocalendar()[1] % 2
|
||||
current_day = current_time.weekday()
|
||||
|
||||
current_seconds = current_week * 604800 + current_day * 86400 + current_time.hour * 3600 + current_time.minute \
|
||||
* 60 + current_time.second
|
||||
|
||||
reference_time = int(current_time.strftime("%s")) - current_seconds
|
||||
|
||||
if base_command == "!пара":
|
||||
study_begin_ts = int(datetime(year=2023, month=9, day=4).strftime("%s"))
|
||||
current_ts = int(datetime.now().strftime("%s"))
|
||||
|
||||
if -3600*4 < study_begin_ts - current_ts < 0:
|
||||
return "Навчання незабаром розпочнеться!"
|
||||
elif 0 <= study_begin_ts - current_ts < 1209600:
|
||||
return f"До навчання залишилося {study_begin_ts - current_ts} секунд..."
|
||||
elif study_begin_ts - current_ts >= 1209600:
|
||||
return "Ви маєте законне право відпочити, пари почнуться не скоро"
|
||||
|
||||
upcoming_lessons = [timestamp for timestamp in schedule if timestamp > current_seconds - 5400]
|
||||
|
||||
if len(upcoming_lessons) > 0:
|
||||
closest_lesson_time = min(upcoming_lessons)
|
||||
else:
|
||||
closest_lesson_time = min(schedule)
|
||||
|
||||
return "*Актуальна пара*: " + get_lesson_description(schedule, reference_time, closest_lesson_time, current_day,
|
||||
current_week)
|
||||
|
||||
elif base_command == "!пари":
|
||||
base_day = current_week * 7 + current_day
|
||||
|
||||
if len(full_command) >= 2:
|
||||
args = [i for i in full_command[1:] if len(i) > 1]
|
||||
preferences, selected_day = process_arguments(args, base_day)
|
||||
else:
|
||||
preferences = {}
|
||||
selected_day = base_day
|
||||
|
||||
lesson_list = [i for i in schedule if selected_day * 86400 <= i < (selected_day + 1) * 86400]
|
||||
|
||||
lesson_descriptions_list = ["*Назва*: " + get_lesson_description(schedule, reference_time, lesson_time,
|
||||
current_day, current_week, overrides=preferences)
|
||||
for lesson_time in lesson_list]
|
||||
|
||||
return f"__Пари у {WEEKDAYS_ACCUSATIVE[selected_day % 7]}__:\n" + "\n\n".join(lesson_descriptions_list)
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"index_file": "main.py",
|
||||
"start_on_boot": true,
|
||||
"alias": "auto-schedule-pro-v2"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
../auto-schedule-pro/schedule.json
|
||||
@@ -1,6 +1,5 @@
|
||||
[
|
||||
{
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення", "teacher": "Кушлаба М. П.", "link": "https://bbb.comsys.kpi.ua/b/myk-0iw-red-p01"}
|
||||
},
|
||||
{
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
## code ##
|
||||
if (self.MESSAGE["text"].lower() == "!пара" or self.MESSAGE["text"].lower().split()[0] == "!пари"):
|
||||
if (self.MESSAGE["text"].lower() == "!пара-old2" or self.MESSAGE["text"].lower().split()[0] == "!пари-old2"):
|
||||
|
||||
#getting current time
|
||||
current_time = datetime.datetime.now()
|
||||
@@ -31,7 +31,7 @@ if (self.MESSAGE["text"].lower() == "!пара" or self.MESSAGE["text"].lower().
|
||||
|
||||
full_schedule = dict(list(schedule.items()) + list(additions.items()))
|
||||
|
||||
if self.MESSAGE["text"].lower() == "!пара":
|
||||
if self.MESSAGE["text"].lower() == "!пара-old2":
|
||||
print("test1")
|
||||
print(f"Full schedule printout: {full_schedule}")
|
||||
print(f"Current delta_time: {current_seconds}")
|
||||
@@ -79,10 +79,10 @@ if self.MESSAGE["text"].lower() == "!пара":
|
||||
human_readable_date += " до "
|
||||
human_readable_date += dt_lesson_finish.strftime("%H:%M")
|
||||
|
||||
self.RESPONCE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link'])
|
||||
self.RESPONSE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link'])
|
||||
print("test3.1.5")
|
||||
else:
|
||||
self.RESPONCE = "Пар немає взагалі. Ми вільні!"
|
||||
self.RESPONSE = "Пар немає взагалі. Ми вільні!"
|
||||
|
||||
else:
|
||||
print("test3.2")
|
||||
@@ -106,9 +106,9 @@ if self.MESSAGE["text"].lower() == "!пара":
|
||||
human_readable_date += " до "
|
||||
human_readable_date += dt_lesson_finish.strftime("%H:%M")
|
||||
|
||||
self.RESPONCE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link'])
|
||||
self.RESPONSE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link'])
|
||||
|
||||
if self.MESSAGE["text"].lower().split()[0] == "!пари":
|
||||
if self.MESSAGE["text"].lower().split()[0] == "!пари-old2":
|
||||
command = self.MESSAGE["text"].lower().split()
|
||||
|
||||
preferences = {"name": True, "date": True, "teacher": True, "link": True}
|
||||
@@ -183,4 +183,4 @@ if self.MESSAGE["text"].lower().split()[0] == "!пари":
|
||||
|
||||
result_text += "\n"
|
||||
|
||||
self.RESPONCE = result_text
|
||||
self.RESPONSE = result_text
|
||||
|
||||
@@ -1,52 +1,55 @@
|
||||
[
|
||||
{
|
||||
"8:30": {"name": "Дискретна математика", "teacher": "Новотарський М. А.", "link": "https://us02web.zoom.us/j/87578307057?pwd=UGwyVGlwc3M4Q0Q0Q0NLWUt6bmVpUT09"},
|
||||
"10:25": {"name": "Комп'ютерна логіка", "teacher": "Жабін В. І.", "link": "https://bbb.comsys.kpi.ua/b/val-2vb-o7w-y5y АБО https://bbb.ugrid.org/b/val-osi-lup-ou8"},
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення", "teacher": "Онуфрієнко О. П.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"8:30": {"name": "Політична наука: конфліктологічний підхід (лекція)", "teacher": "Багінський Андрій Владиславович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Захист персональних даних: стандарти ЄС та Ради Європи & Психологія & Психологія конфлікту (лекції/практики)", "teacher": "Дубняк М. В. & Волянюк Н. Ю. & Москаленко О. В.", "link": "https://us04web.zoom.us/j/7423381732?pwd=c1pJclU2ZDRUWDgyUE10dmhJUDhiZz09 & https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09 & https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09"},
|
||||
"14:15": {"name": "Основи електронного урядування (лекція)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 1", "teacher": "Шевченко О. М.", "link": "https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Фізика", "teacher": "Федотов В. В. & Іванова І. М.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лабораторна)", "teacher": "Васильєва Марія Давидівна", "link": "https://zoom.us/wc/88696149166/join?from=join&_x_zm_rtaid=qhdJKhYLQNakh-zwxMG4lg.1693903841334.ad606145c892a54a4b450526e2394cbe&_x_zm_rhtaid=531"},
|
||||
"14:15": {"name": "Теорія електричних кіл та сигналів (лабораторна)", "teacher": "Лободзинський В. Ю. & Ілліна О. О.", "link": "https://meet.google.com/gwx-sshq-sqb"}
|
||||
},
|
||||
{
|
||||
"8:30": {"name": "Програмування. Частина 2. Об'єктно-орієнтоване програмування", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"},
|
||||
"10:25": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"8:30": {"name": "Теорія ймовірності та математична статистика (лекція)", "teacher": "Марковський Олександр Петрович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Вступ до операційної системи Linux (лекція)", "teacher": "Роковий Олександр Петрович", "link": "(посилання відсутнє!)"},
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Фізика", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"14:15": {"name": "Програмування. Частина 2. Об'єктно-орієнтоване програмування", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"}
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "(посилання відсутнє!)"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Соціальна психологія (практика)", "teacher": "Блохіна Ірина Олександрівна", "link": "(посилання відсутнє!)"},
|
||||
"16:10": {"name": "Основи електронного урядування (практика)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Фізика", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"12:20": {"name": "Дискретна математика", "teacher": "Пономаренко А. М.", "link": "https://us05web.zoom.us/j/7089075754?pwd=TWRlZmxyVlFiTWU1UGlVVU1XcFE0Zz09"},
|
||||
"14:15": {"name": "Основи здорового способу життя", "teacher": "Соболенко А. І.", "link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09"}
|
||||
"8:30": {"name": "Вступ до філософії (лекція)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{},
|
||||
{},
|
||||
{
|
||||
"8:30": {"name": "Дискретна математика", "teacher": "Новотарський М. А.", "link": "https://us02web.zoom.us/j/87578307057?pwd=UGwyVGlwc3M4Q0Q0Q0NLWUt6bmVpUT09"},
|
||||
"10:25": {"name": "Комп'ютерна логіка", "teacher": "Жабін В. І.", "link": "https://bbb.comsys.kpi.ua/b/val-2vb-o7w-y5y АБО https://bbb.ugrid.org/b/val-osi-lup-ou8"},
|
||||
"12:20": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"10:25": {"name": "Психологія & Психологія конфлікту (практики)", "teacher": "Сербова О. В. & Кононець М. О.", "link": "https://us04web.zoom.us/j/6762396563?pwd=L1EvTmpFZHBSdkRHUjZyRG95SFl4QT09 & https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09"},
|
||||
"12:20": {"name": "Політична наука: конфліктологічний підхід & Захист персональних даних: стандарти ЄС та Ради Європи (практики)", "teacher": "Северинчик О. П. & Самчинська О. А.", "link": "https://zoom.us/j/5175581158?pwd=UlhFY3lBOUUrNG9pclRVNndTNTZzQT09 & (посилання відсутнє!)"},
|
||||
"14:15": {"name": "Розумні міста (лекція)", "teacher": "Чукут Світлана Анатоліївна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"8:30": {"name": "Комп'ютерна логіка", "teacher": "Верба О. А.", "link": "https://us04web.zoom.us/j/7382214783?pwd=RnZ3SWgwK1JoVkZtNndnKzdPZjFGdz09"},
|
||||
"10:25": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 1", "teacher": "Шевченко О. М.", "link": "https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Фізика", "teacher": "Федотов В. В. & Іванова І. М.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!"}
|
||||
"10:25": {"name": "Вступ до філософії (практика)", "teacher": "Руденко Тамара Петрівна", "link": "(посилання відсутнє!)"},
|
||||
"14:15": {"name": "Теорія ймовірності та математична статистика (практика)", "teacher": "Марковський Олександр Петрович", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"}
|
||||
"8:30": {"name": "Теорія ймовірності та математична статистика (лекція)", "teacher": "Марковський Олександр Петрович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Вступ до операційної системи Linux (лекція)", "teacher": "Роковий Олександр Петрович", "link": "(посилання відсутнє!)"},
|
||||
"12:20": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"},
|
||||
"14:15": {"name": "Інженерія програмного забезпечення (лекція)", "teacher": "Васильєва Марія Давидівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Вища математика", "teacher": "Ординська З. П.", "link": "https://us04web.zoom.us/j/2684350438?pwd=kiOi3BrgbJHeYvkrx7qaSxa08J8m8O.1"},
|
||||
"12:20": {"name": "Фізика", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"14:15": {"name": "Програмування. Частина 2. Об'єктно-орієнтоване програмування", "teacher": "Алещенко О. В.", "link": "https://us02web.zoom.us/j/2711546637?pwd=Ry82RHp3SjV6WTZRMXl6WUNod25hUT09"}
|
||||
"8:30": {"name": "Вступ до операційної системи Linux (лабораторна)", "teacher": "Алєнін Олег Ігорович", "link": "(посилання відсутнє!)"},
|
||||
"10:25": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (практика)", "teacher": "Стаматієва Вікторія В'ячеславівна", "link": "(старе посилання!) https://us04web.zoom.us/j/2313886209?pwd=dnZHanV3cU9LUXJBVWYyYVArUFg5dz09"},
|
||||
"12:20": {"name": "Практичний курс іноземної мови. Частина 2 (практика)", "teacher": "Шевченко Ольга Миколаївна", "link": "(старе посилання!) https://meet.google.com/bwg-pdnr-evh"},
|
||||
"14:15": {"name": "Соціальна психологія (лекція) & Розумні міста (практика)", "teacher": "Винославська О. В. & Чукут С. А.", "link": "(посилання відсутні!)"}
|
||||
},
|
||||
{
|
||||
"10:25": {"name": "Фізика", "teacher": "Русаков В. Ф.", "link": "В житті не буває нічого вічного. Життя мінливе, як і посилання на кожну нову пару. Щасти вам його віднайти!", "container_id": "1"},
|
||||
"12:20": {"name": "Культура мовлення та ділове мовлення", "teacher": "Кушлаба М. П.", "link": "https://bbb.comsys.kpi.ua/b/myk-0iw-red-p01"},
|
||||
"14:15": {"name": "Основи здорового способу життя", "teacher": "Соболенко А. І.", "link": "https://zoom.us/j/2035574145?pwd=bk1wTVhGbjJsQTR4WmVQMlROWFBCZz09"}
|
||||
"10:25": {"name": "Теорія електричних кіл та сигналів (лекція)", "teacher": "Лободзинський Вадим Юрійович", "link": "https://meet.google.com/gwx-sshq-sqb"},
|
||||
"12:20": {"name": "Вища математика. Частина 3. Ряди. Теорія функцій комплексної змінної. Операційне числення (лекція)", "teacher": "Овчар Раїса Федорівна", "link": "(посилання відсутнє!)"}
|
||||
},
|
||||
{},
|
||||
{}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import datetime
|
||||
import json
|
||||
import time
|
||||
import os
|
||||
|
||||
current_time = datetime.datetime.now()
|
||||
@@ -84,7 +85,7 @@ if next_pair_time == None:
|
||||
#print("test3.1.5")
|
||||
if 'container_id' in p:
|
||||
try:
|
||||
cont = json.decode(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
cont = json.loads(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
if (time.time() - cont['update_ts']) > 43200:
|
||||
if ("QUERY_STRING" in os.environ) and ("force" in os.environ['QUERY_STRING'].lower()):
|
||||
print(f"Location: {cont['link']}\n\n", end = '')
|
||||
@@ -102,7 +103,7 @@ if next_pair_time == None:
|
||||
new_seed = os.environ['REMOTE_ADDR'] + datetime.datetime.now().replace(minute = 0, second = 0).strftime("%s")
|
||||
random.seed(new_seed)
|
||||
surprise_pool = ["Йой!", "От халепа!", "Ой лишенько!"]
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p>")
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p><p>(технічна інформація про помилку: {e}</p>")
|
||||
|
||||
else:
|
||||
print(f"Location: {p['link'].split()[0]}\n\n", end = '')
|
||||
@@ -139,7 +140,7 @@ else:
|
||||
|
||||
if 'container_id' in p:
|
||||
try:
|
||||
cont = json.decode(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
cont = json.loads(open(f"../containers/{p['container_id']}", 'r').read())
|
||||
if (time.time() - cont['update_ts']) > 43200:
|
||||
if ("QUERY_STRING" in os.environ) and ("force" in os.environ['QUERY_STRING'].lower()):
|
||||
print(f"Location: {cont['link']}\n\n", end = '')
|
||||
@@ -157,7 +158,7 @@ else:
|
||||
new_seed = os.environ['REMOTE_ADDR'] + datetime.datetime.now().replace(minute = 0, second = 0).strftime("%s")
|
||||
random.seed(new_seed)
|
||||
surprise_pool = ["Йой!", "От халепа!", "Ой лишенько!"]
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p>")
|
||||
print(f"Content-Type: text/html; charset=UTF-8\n\n<h2>{random.choice(surprise_pool)}</h2><br><p>Під час спроби отримання посилання на пару {p['name']} сталася непередбачена помилка. Ви можете оновлювати сторінку, поки проблема не зникне (перенаправлення відбудеться, щойно все запрацює), або пошукати посилання де-інде.</p><p>Вибачте за тимчасові незручності(</p><p>(технічна інформація про помилку: {e}</p>")
|
||||
|
||||
else:
|
||||
print(f"Location: {p['link'].split()[0]}\n\n", end = '')
|
||||
|
||||
@@ -24,7 +24,7 @@ if self.MESSAGE["text"].lower() == "!пара-old":
|
||||
pair_found = True
|
||||
break
|
||||
|
||||
self.RESPONCE = f"Сьогодні вихідний, тому пар немає)\n"\
|
||||
self.RESPONSE = f"Сьогодні вихідний, тому пар немає)\n"\
|
||||
f"Наступна пара - {next_pair['subject']} ({next_pair['lector']}) о {self.reverse_timetable[int(j)]} у {self.days_rod[day]}\n"\
|
||||
f"Посилання (якщо воно чомусь треба): {next_pair['link']}"
|
||||
else:
|
||||
@@ -33,13 +33,13 @@ if self.MESSAGE["text"].lower() == "!пара-old":
|
||||
print("[DEBUG] Looking up a relevant pair...")
|
||||
try:
|
||||
relevant_pair = schedule[current_week][current_day][str(self.timetable[i])]
|
||||
self.RESPONCE = f"Актуальна пара: {relevant_pair['subject']} ({relevant_pair['lector']}), початок о {self.reverse_timetable[self.timetable[i]]}\n"\
|
||||
self.RESPONSE = f"Актуальна пара: {relevant_pair['subject']} ({relevant_pair['lector']}), початок о {self.reverse_timetable[self.timetable[i]]}\n"\
|
||||
f"Посилання: {relevant_pair['link']}"
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"[WARN] module: auto-schedule: exception {e} while looking up the pair")
|
||||
else:
|
||||
self.RESPONCE = "Сьогодні більше немає пар"
|
||||
self.RESPONSE = "Сьогодні більше немає пар"
|
||||
|
||||
except Exception as e:
|
||||
print(f"[WARN] module: auto-schedule: failed to process schedule.json ({e})")
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
if msg.chat["type"] == "private":
|
||||
self.RESPONCE = self.MESSAGE["text"]
|
||||
self.RESPONSE = self.MESSAGE["text"]
|
||||
|
||||
@@ -9,4 +9,5 @@ if "%" in self.MESSAGE["text"]:
|
||||
tagged_users |= self.tag_sets[i]
|
||||
|
||||
if tagging_issued:
|
||||
self.RESPONCE = "Користувач використав масовий тег з повідомленням: {}\n\n{}".format(self.MESSAGE["text"], " ".join(tagged_users))
|
||||
self.RESPONSE = f"Користувач використав масовий тег з повідомленням: {self.MESSAGE['text']}\n\n" \
|
||||
f"{' '.join(tagged_users)}"
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
"trigger_lists": [
|
||||
["коли", "тест", "обж"]
|
||||
],
|
||||
"responce_text": "Тести з ОБЖ необхідно проходити лише тим студентам, які не були на практичному занятті. Якщо Ви були на практиці, але все одно пройдете тест, то ризикуєте отримати нижчу оцінку та знизити свій загальний бал"
|
||||
"response_text": "Тести з ОБЖ необхідно проходити лише тим студентам, які не були на практичному занятті. Якщо Ви були на практиці, але все одно пройдете тест, то ризикуєте отримати нижчу оцінку та знизити свій загальний бал"
|
||||
}
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
msg = self.MESSAGE["text"].lower()
|
||||
|
||||
responce_given = False
|
||||
response_given = False
|
||||
|
||||
for file in os.listdir(self.path + "db/"):
|
||||
if responce_given:
|
||||
if response_given:
|
||||
break
|
||||
|
||||
try:
|
||||
criteria = json.loads( readfile(self.path + "db/" + file) )
|
||||
criteria = json.loads(readfile(self.path + "db/" + file))
|
||||
|
||||
for wordset in criteria["trigger_lists"]:
|
||||
for word_set in criteria["trigger_lists"]:
|
||||
all_words_in = True
|
||||
for word in wordset:
|
||||
for word in word_set:
|
||||
if word not in msg:
|
||||
all_words_in = False
|
||||
break
|
||||
|
||||
if all_words_in:
|
||||
self.RESPONCE = criteria["responce_text"]
|
||||
responce_given = True
|
||||
self.RESPONSE = criteria["response_text"]
|
||||
response_given = True
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
command = self.MESSAGE['text'].split(" ", 2)
|
||||
command_length = len(command)
|
||||
|
||||
if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
try:
|
||||
import requests
|
||||
|
||||
if command_length == 1:
|
||||
chosen_model = "auto-uk"
|
||||
else:
|
||||
chosen_model = command[1]
|
||||
|
||||
source, target = chosen_model.split("-")
|
||||
|
||||
if command_length == 3:
|
||||
text_to_translate = command[2]
|
||||
else:
|
||||
text_to_translate = self.MESSAGE['reply_to_message']['text']
|
||||
|
||||
data = {"q": text_to_translate,
|
||||
"source": source,
|
||||
"target": target,
|
||||
"format": "text"}
|
||||
|
||||
res = requests.post("http://127.0.0.1:5000/translate", data = data)
|
||||
result = json.loads(res.text)
|
||||
|
||||
if source == "auto":
|
||||
self.RESPONSE = f"Результат ({result['detectedLanguage']['language']} - {result['detectedLanguage']['confidence']}%): {result['translatedText']}"
|
||||
else:
|
||||
self.RESPONSE = f"Результат: {result['translatedText']}"
|
||||
|
||||
except Exception as e:
|
||||
print(f"[translit-decoder] Got exception: {e}")
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 1,
|
||||
"index_file": "index.py",
|
||||
"start_on_boot": true,
|
||||
"alias": "translator",
|
||||
"predefine": "predefine.py"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
self.aliases = ["!translate", "!t"]
|
||||
@@ -17,14 +17,15 @@ if (command[0] in self.aliases) and (1 <= command_length <= 3):
|
||||
|
||||
decoded_text = text_to_decode
|
||||
if chosen_model not in models:
|
||||
self.RESPONCE = f"Такого варіанту транслітерації не існує. Доступні варіанти: {', '.join(list(models.keys()))}"
|
||||
self.RESPONSE = f"Такого варіанту транслітерації не існує. Доступні варіанти: " \
|
||||
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].capitalize(), i[1].capitalize())
|
||||
decoded_text = decoded_text.replace(i[0].upper(), i[1].upper())
|
||||
|
||||
self.RESPONCE = f"Результат: {decoded_text}"
|
||||
self.RESPONSE = f"__Результат__\n{decoded_text}"
|
||||
|
||||
except Exception as e:
|
||||
print(f"[translit-decoder] Got exception: {e}")
|
||||
|
||||
Reference in New Issue
Block a user