Merge pull request #1 from kr0sh512/develop

New version
This commit is contained in:
kr0sh512
2023-12-23 13:55:00 +03:00
committed by GitHub
3 changed files with 395 additions and 179 deletions
+28
View File
@@ -0,0 +1,28 @@
import schedules as bot
admin_id = '856850518'
def admin_command(func):
def wrapper(*args, **kwargs):
message = args[0]
if str(message.from_user.id) != admin_id:
bot.send_message(message.from_user.id, 'Команда доступна только администратору')
return
func(*args, **kwargs)
return
return wrapper
def is_admin(message):
if str(message.from_user.id) == admin_id and message.from_user.id == message.chat.id:
return True
return False
def send_admin_message(text):
bot.send_message(admin_id, '🛑 ' + text)
def send_admin_document(file):
bot.send_document(admin_id, file, '🛑 Admin file')
+85 -29
View File
@@ -6,11 +6,14 @@ from datetime import datetime
path_users = "json/users.json" # Нужный путь до json файлов path_users = "json/users.json" # Нужный путь до json файлов
path_schedule = "json/schedule.json" path_schedule = "json/schedule.json"
allow_update = True
def save_user(infos): def save_user(infos):
for i in range(len(infos)): for i in range(len(infos)):
if type(infos[i]) == type(None): if type(infos[i]) == type(None):
infos[i] = '' infos[i] = ''
infos[i] = str(infos[i]) infos[i] = str(infos[i])
infos = { infos = {
"id" : infos[0], "id" : infos[0],
"first_name" : infos[1], "first_name" : infos[1],
@@ -39,6 +42,7 @@ def save_user(infos):
return return
def change_user_param(id, key, value): def change_user_param(id, key, value):
id = str(id)
data = {} data = {}
with open(path_users, 'r', encoding='utf-8') as json_file: with open(path_users, 'r', encoding='utf-8') as json_file:
data = json.load(json_file) data = json.load(json_file)
@@ -50,28 +54,10 @@ def change_user_param(id, key, value):
create_schedule_tasks() create_schedule_tasks()
return return
def create_schedule_tasks(): def parse_lesson(time, lesson):
schedule.clear()
users = {}
schdl = {}
with open(path_users, 'r', encoding='utf-8') as json_file:
users = json.load(json_file)
with open(path_schedule, 'r', encoding='utf-8') as json_file:
schdl = json.load(json_file)
for id, params in users.items():
if params['allow_message'] != 'yes':
continue
group = params['group']
if group == 'other':
continue
timeout = params['timeout']
for day in schdl[group]:
for i, lesson in schdl[group][day].items():
if lesson["name"] == "": # Неправильный формат schedule
continue
start, end = i.split("-")
text = '' text = ''
start, end = time.split("-")
if len(lesson["infos"].split('|')) == 2: if len(lesson["infos"].split('|')) == 2:
teacher = lesson["infos"].split('|')[0] teacher = lesson["infos"].split('|')[0]
room = lesson["infos"].split('|')[1] room = lesson["infos"].split('|')[1]
@@ -91,12 +77,48 @@ def create_schedule_tasks():
elif len(lesson["infos"].split('|')) == 1: elif len(lesson["infos"].split('|')) == 1:
text = '{}-{}\ text = '{}-{}\
\n<b>{}</b>'.format(start, end, lesson["name"]) \n<b>{}</b>'.format(start, end, lesson["name"])
else: #неправильный формат infos в json файле else:
print("что-то не так") print("что-то не так")
print(lesson["name"]) print(lesson["name"])
return text
def create_schedule_tasks(manual=False):
global allow_update
if not manual:
bot.send_admin_message('Произошёл auto-update')
if not allow_update:
return
allow_update = True
schedule.clear()
users = {}
schdl = {}
with open(path_users, 'r', encoding='utf-8') as json_file:
users = json.load(json_file)
with open(path_schedule, 'r', encoding='utf-8') as json_file:
schdl = json.load(json_file)
for id, params in users.items():
if params['allow_message'] != 'yes':
continue
group = params['group']
if group == 'other':
continue
timeout = params['timeout']
for day in schdl[group]:
for i, lesson in schdl[group][day].items():
if lesson["name"] == "": # Неправильный формат schedule
continue
start = i.split("-")[0]
text = parse_lesson(i, lesson)
if text == '':
continue continue
thread_id = params["thread"] thread_id = params["thread"]
delta = '00:' + params["timeout"] delta = '00:' + params["timeout"]
format = '%H:%M' format = '%H:%M'
start_task = datetime.strptime(start, format) - datetime.strptime(delta, format) start_task = datetime.strptime(start, format) - datetime.strptime(delta, format)
@@ -104,6 +126,7 @@ def create_schedule_tasks():
for i in str(start_task).split(':'): for i in str(start_task).split(':'):
tmp += (('0' + i ) if len(i) < 2 else i) + ":" tmp += (('0' + i ) if len(i) < 2 else i) + ":"
start_task = tmp[:-1] start_task = tmp[:-1]
if day == 'mon': if day == 'mon':
schedule.every().monday.at(start_task).do(bot.send_message, id, text, thread_id) schedule.every().monday.at(start_task).do(bot.send_message, id, text, thread_id)
elif day == 'tue': elif day == 'tue':
@@ -117,22 +140,55 @@ def create_schedule_tasks():
elif day == 'sat': elif day == 'sat':
schedule.every().saturday.at(start_task).do(bot.send_message, id, text, thread_id) schedule.every().saturday.at(start_task).do(bot.send_message, id, text, thread_id)
bot.send_message(bot.admin_id, '🛑 Произошёл update')
return return
def groups_in_json():
def check_group_in_json(number):
schdl = {} schdl = {}
with open(path_schedule, 'r', encoding='utf-8') as json_file: with open(path_schedule, 'r', encoding='utf-8') as json_file:
schdl = json.load(json_file) schdl = json.load(json_file)
return str(number) in schdl.keys()
return schdl.keys()
def return_infos(id): def return_infos(id):
id = str(id)
data = {} data = {}
with open(path_users, 'r', encoding='utf-8') as json_file: with open(path_users, 'r', encoding='utf-8') as json_file:
data = json.load(json_file) data = json.load(json_file)
data = data[id] data = data[id]
text = '<i>Выбранная группа</i>: <b>{}</b>\
\n<i>Время напоминания до урока</i>: <b>{}</b>\ return data
\n<i>Разрешены ли напоминания</i>: <b>{}</b>'.format(data['group'], data['timeout'], ('да' if data['allow_message'] == 'yes' else 'нет'))
def pause_bot():
schedule.clear()
global allow_update
allow_update = False
return
def get_schedule(id, day):
id = str(id)
if day == 'sun':
day = 'mon'
days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat']
russian_days = ['понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу']
text = '<u>Расписание на {}</u>:\n\n'.format(russian_days[days.index(day)])
schdl_today = {}
with open(path_schedule, 'r', encoding='utf-8') as schedule_file:
group = ''
with open(path_users, 'r', encoding='utf-8') as user_file:
group = json.load(user_file)[id]['group']
if (group == 'other'):
return 'У тебя не выбрана группа для рассылки сообщений'
try:
schdl_today = json.load(schedule_file)[group][day]
except:
return 'Расписания твоей группы на {} нет'.format(russian_days[days.index(day)])
for i, lesson in schdl_today.items():
text += '' + parse_lesson(i, lesson) + '\n\n'
return text return text
+265 -133
View File
@@ -1,61 +1,116 @@
#!/usr/bin/python3.3 #!/usr/bin/python3.3
import threading, telebot, schedule, time import threading, telebot, schedule, time
from datetime import datetime
import os, sys import os, sys
from telebot import types from telebot import types
from telegram.constants import ParseMode from telegram.constants import ParseMode
import for_json import for_json
from admin import admin_command, is_admin, send_admin_message, send_admin_document
bot = telebot.TeleBot("TOKEN_API") bot = telebot.TeleBot("TOKEN_API")
admin_id = '856850518'
start_txt = 'Привет! Это бот, который будет кидать тебе сообщения перед нужной парой с номером кабинета/фамилией препода\
\n\nCreated by: @Kr0sH\_512'
@bot.message_handler(commands=['update'])
@bot.message_handler(commands=['help', 'faq'])
def help(message):
help_msg = 'Мои команды:\
\n/start - используй, чтобы сменить номер группы.\
\n/schedule - используй, чтобы получить расписание на сегодня.\
\n/info - используй, чтобы узнать твои настройки бота\
\n/pause - используй, чтобы прекратить получать сообщения от бота\
\n/thread - используй в нужном чате канала, чтобы бот отправлял сообщения именно туда\
\n/timeout - настрой время, когда бот будет присылать тебе сообщение\
\n/request - используй, чтобы отправить разработчику какой-то запрос\
\n/source - Страница бота на Github\
\n\nИли же можно всегда написать напрямую: @Kr0sH_512'
send_message(message.chat.id, help_msg)
if is_admin(message):
admin_help_msg = 'И команды только для админа:\
\n/restart - перезапуск бота.\
\n/update - обновление schedule задач\
\n/json - получить файл пользователей и расписания\
\n/info <i>id_пользователя</i> - узнать настройки пользователя\
\n/pause_all - приостановить бота для всех (каникулы/выходные)\
\n/stop <i>id_пользователя</i> - приостановить отправку сообщений для пользователя'
send_admin_message(admin_help_msg)
return
### --//--
@bot.message_handler(commands=['test'])
@admin_command
def update_schedules(message): def update_schedules(message):
if (str(message.from_user.id) != admin_id): text = '<b>Жирный текст</b>\
bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown') \n<i>Курсивный текст</i>\
else: \n<s>Перечёркнутый текст</s>\
for_json.create_schedule_tasks() \n<a href="google.com">Ссылка</a>\
\n<code>Моноширинный текст</code>\
\n<pre>Форматированный с сохранением пробелов</pre>\
\n<blockquote>Цитата</blockquote>'
send_admin_message(text)
return return
@bot.message_handler(commands=['restart']) @bot.message_handler(commands=['restart'])
@admin_command
def restart_bot(message): def restart_bot(message):
if (str(message.from_user.id) != admin_id): send_admin_message('bye')
bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown')
else:
bot.send_message(admin_id, '🛑 bye', parse_mode=ParseMode.HTML)
os.execv(sys.executable, ['python'] + sys.argv) os.execv(sys.executable, ['python'] + sys.argv)
@bot.message_handler(commands=['update'])
@admin_command
def update_schedules(message):
for_json.create_schedule_tasks(manual=True)
send_admin_message('Произошёл update')
return return
@bot.message_handler(commands=['json']) @bot.message_handler(commands=['json'])
@admin_command
def send_json(message): def send_json(message):
if (str(message.from_user.id) != admin_id):
bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown')
else:
with open(for_json.path_users, 'rb') as json_file: with open(for_json.path_users, 'rb') as json_file:
bot.send_document(admin_id, json_file) send_admin_document(json_file)
with open(for_json.path_schedule, 'rb') as json_file: with open(for_json.path_schedule, 'rb') as json_file:
bot.send_document(admin_id, json_file) send_admin_document(json_file)
return return
# info user_id
@bot.message_handler(commands=['pause_all'])
@admin_command
def pause_bot(message):
for_json.pause_bot()
send_admin_message('Бот больше не отправляет расписание')
return
@bot.message_handler(commands=['stop'])
@admin_command
def pause_bot(message):
if len(str(message.text).split(' ')) != 2:
send_admin_message('Эта команда вида /stop <i>id_пользователя</i>')
return
for_json.change_user_param(str(message.text).split(' ')[1], 'allow_message', 'no')
send_admin_message('Успешно')
return
### --//--
@bot.message_handler(commands=['start']) @bot.message_handler(commands=['start'])
def start(message): def start(message):
start_txt = 'Привет! Это бот, который будет кидать тебе сообщения перед нужной парой с номером кабинета/фамилией препода\
\n\nТы можешь настроить отправку сообщений в лс или добавить меня в группу, куда я буду присылать расписание\
\n\nCreated by: @Kr0sH_512'
if message.chat.type == "supergroup": if message.chat.type == "supergroup":
print(message.text)
print(message.chat.id)
print(message.text.split(' '))
if len(message.text.split(' ')) != 2: if len(message.text.split(' ')) != 2:
bot.send_message(message.chat.id, start_txt, parse_mode='Markdown') send_message(message.chat.id, start_txt)
bot.send_message(message.chat.id, 'Похоже, что этот бот добавлен в группу. Чтобы он присылал расписание в чат, \ send_message(message.chat.id, 'Похоже, что этот бот добавлен в группу. Чтобы он присылал расписание в чат, \
запустите его заново, указав вместе с /start@vmk_schedule_bot номер\_своей\_группы.\ укажите вместе с /start@vmk_schedule_bot номер своей группы.\
\nПример:\n/start@vmk_schedule_bot 102', parse_mode='Markdown') \nПример:\n/start@vmk_schedule_bot 102')
else: else:
temp = message.text.split(' ')[1] temp = message.text.split(' ')[1]
@@ -68,33 +123,34 @@ def start(message):
temp temp
] ]
if for_json.check_group_in_json(temp): if temp in for_json.groups_in_json():
bot.send_message(message.chat.id, \ send_message(message.chat.id,
'Отлично! Теперь я буду присылать вам расписание {} группы'.format(temp), parse_mode='Markdown') 'Отлично! Теперь я буду присылать вам расписание {} группы'.format(temp))
else: else:
bot.send_message(message.chat.id, 'Похоже, что расписания для этой группы ещё не существует. \ send_message(message.chat.id, 'Похоже, что расписания для этой группы ещё не существует. \
\nРазработчик уже пинается, но можете дополнительно написать ему: @Kr0sH\_512', parse_mode='Markdown') \nРазработчик уже пинается, но можете дополнительно написать ему: @Kr0sH_512')
send_message(admin_id, '🛑 В группе {} был запрос на {} группу.\
send_admin_message('В группе {} был запрос на {} группу.\
\nid: {}'.format(message.chat.title, temp, message.chat.id)) \nid: {}'.format(message.chat.title, temp, message.chat.id))
temp = 'other' temp = 'other'
for_json.save_user(infos) for_json.save_user(infos)
else: else:
bot.send_message(message.chat.id, 'Введено не число. Попробуйте снова.\ send_message(message.chat.id, 'Введено не число. Попробуйте снова.\
\nПример:\n/start@vmk_schedule_bot 102', parse_mode='Markdown') \nПример:\n/start@vmk_schedule_bot 102')
return return
bot.send_message(message.chat.id, start_txt, parse_mode='Markdown') send_message(message.chat.id, start_txt)
markup = types.InlineKeyboardMarkup() markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton(text="102", callback_data="102")) for i in for_json.groups_in_json():
markup.add(types.InlineKeyboardButton(text="103", callback_data="103")) markup.add(types.InlineKeyboardButton(text=i, callback_data=i))
markup.add(types.InlineKeyboardButton(text="105", callback_data="105"))
markup.add(types.InlineKeyboardButton(text="Моей группы нет в этом списке", callback_data="other")) markup.add(types.InlineKeyboardButton(text="Моей группы нет в этом списке", callback_data="other"))
bot.send_message(message.chat.id, 'Пожалуйста, выбери свою группу', parse_mode='Markdown', reply_markup=markup) bot.send_message(message.chat.id, 'Пожалуйста, выбери свою группу', parse_mode=ParseMode.HTML, reply_markup=markup)
return return
@bot.callback_query_handler(func=lambda call: True) @bot.callback_query_handler(func=lambda call: not(call.data in ['left', 'right']))
def callback_inline(call): def callback_inline(call):
infos = [ infos = [
call.from_user.id, call.from_user.id,
@@ -103,6 +159,7 @@ def callback_inline(call):
call.from_user.username, call.from_user.username,
call.data call.data
] ]
for_json.save_user(infos) for_json.save_user(infos)
if call.data == 'other': if call.data == 'other':
@@ -111,48 +168,155 @@ def callback_inline(call):
text='Используй команду /request \ text='Используй команду /request \
и напиши номер группы, которую хочешь добавить\ и напиши номер группы, которую хочешь добавить\
\nПосле создания расписания для твоей группы, я пришлю тебе сообщение', \nПосле создания расписания для твоей группы, я пришлю тебе сообщение',
parse_mode='Markdown') parse_mode=ParseMode.HTML)
else: else:
bot.edit_message_text(chat_id=call.message.chat.id, bot.edit_message_text(chat_id=call.message.chat.id,
message_id=call.message.message_id, message_id=call.message.message_id,
text='Отлично, теперь тебе будут приходить сообщения!', text='Отлично, теперь тебе будут приходить сообщения!',
parse_mode='Markdown') parse_mode=ParseMode.HTML)
return return
@bot.message_handler(commands=['help', 'faq'])
def help(message):
help_msg = 'Мои команды:\ @bot.message_handler(commands=['schedule'])
\n/start - используй, чтобы сменить номер группы.\ def send_schedule(message):
\n/info - используй, чтобы узнать твои настройки бота\ text = 'К сожалению, бот не может отправить тебе расписание твоей группы на сегодня :('
\n/pause - используй, чтобы прекратить получать сообщения от бота\ try:
\n/thread - используй в нужном чате канала, чтобы бот отправлял сообщения именно туда\ day = datetime.today().strftime('%A').lower()[:3] # mon tue ...
\n/timeout - настрой время, когда бот будет присылать тебе сообщение\ text = for_json.get_schedule(message.chat.id, day)
\n/request - используй, чтобы отправить разработчику какой-то запрос\ except Exception as e:
\n/source - Страница бота на Github\ send_admin_message('Schedule error from: {} \n\n {}'.format(message.chat.id, e))
\n\nИли же можно всегда написать напрямую: @Kr0sH\_512'
bot.send_message(message.chat.id, help_msg, parse_mode='Markdown') markup = types.InlineKeyboardMarkup()
if str(message.from_user.id) == admin_id and message.from_user.id == message.chat.id: markup.add(types.InlineKeyboardButton(text="◀️", callback_data="left"),
help_msg = '🛑 И команды только для админа:\ types.InlineKeyboardButton(text="▶️", callback_data="right"))
\n/restart - перезапуск бота.\ bot.send_message(message.chat.id, text, ParseMode.HTML, reply_markup=markup)
\n/update - обновление schedule задач\
\n/json - получить файл пользователей и расписания\
\n/info id\_пользователя - узнать настройки пользователя'
bot.send_message(message.from_user.id, help_msg, parse_mode='Markdown')
return return
@bot.callback_query_handler(func=lambda call: call.data in ['left', 'right'])
def change_schedule(call):
days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat']
russian_days = ['понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу']
i = 6 # выходной
for day in russian_days:
if day in call.message.text:
i = russian_days.index(day)
break
delta = (1) if (call.data == 'right') else (-1)
ind = ((i + delta) % 6) if (i + delta > 0) else (i + delta)
text = for_json.get_schedule(call.message.chat.id, days[ind])
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton(text="◀️", callback_data="left"),
types.InlineKeyboardButton(text="▶️", callback_data="right"))
bot.edit_message_text(text, call.message.chat.id, call.message.message_id,
parse_mode=ParseMode.HTML, reply_markup=markup)
return
@bot.message_handler(commands=['info'])
def send_info(message):
if len(message.text.split(' ')) == 2 and is_admin(message):
send_admin_message('Окей, держи настройки <code>{}</code>'.format(message.text.split(' ')[1]))
infos = for_json.return_infos(message.text.split(' ')[1])
text = '<i>Никнейм</i>: <b>@{}</b>\
\n<i>Имя</i>: <b>{} {}</b>\
\n<i>Выбранная группа</i>: <b>{}</b>\
\n<i>Время напоминания до урока</i>: <b>{}</b>\
\n<i>Разрешены ли напоминания</i>: <b>{}</b>'.format(infos['username'], infos['first_name'], infos['last_name'],
(infos['group'] if infos['group'] != 'other' else 'не выбрана'),
infos['timeout'],
('да' if infos['allow_message'] == 'yes' else 'нет'))
send_admin_message(text)
return
send_message(message.chat.id, 'Хорошо, вот твои настройки:')
infos = for_json.return_infos(message.chat.id)
text = '<i>Выбранная группа</i>: <b>{}</b>\
\n<i>Время напоминания до урока</i>: <b>{}</b>\
\n<i>Разрешены ли напоминания</i>: <b>{}</b>'.format((infos['group'] if infos['group'] != 'other' else 'не выбрана'),
infos['timeout'],
('да' if infos['allow_message'] == 'yes' else 'нет'))
send_message(message.chat.id, text)
return
@bot.message_handler(commands=['pause'])
def pause_schedule(message):
infos = for_json.return_infos(message.chat.id)['allow_message']
if infos == 'yes':
for_json.change_user_param(str(message.chat.id), 'allow_message', 'no')
send_message(message.chat.id, 'Рассылка сообщений преращена. \
\nДля возобновления воспользуйтесь командой\n/pause')
else:
for_json.change_user_param(str(message.chat.id), 'allow_message', 'yes')
send_message(message.chat.id, 'Рассылка сообщений возоблена!')
return
@bot.message_handler(commands=['thread'])
def change_thread(message):
thread_id = ''
try:
thread_id = message.reply_to_message.message_thread_id
except AttributeError:
thread_id = "General"
for_json.change_user_param(str(message.chat.id), 'thread', thread_id)
send_message(message.chat.id, 'Хорошо, теперь я буду отправлять сообщения в этот чат', thread_id)
return
@bot.message_handler(commands=['timeout'])
def set_timeout(message):
send_message(message.chat.id, 'Пришли мне число от 1 до 60. \
\nЭто будет количество минут, за которое я буду присылать тебе напоминание о уроке (По умолчанию: 10)')
bot.register_next_step_handler(message, save_timeout)
return
def save_timeout(message):
if str(message.text).isdigit() and int(message.text) <= 60 and int(message.text) >= 1:
for_json.change_user_param(message.chat.id, 'timeout', str(message.text))
send_message(message.chat.id,
'Хорошо, теперь ты будешь получать напоминания за {} минут до урока'.format(str(message.text)))
else:
send_message(message.chat.id,
'Пожалуйста, пришли <u>число</u> от 1 до 60. \
\nПо умолчанию: 10')
send_message(message.chat.id, 'Изменения не были внесены')
return
@bot.message_handler(commands=['request']) @bot.message_handler(commands=['request'])
def request(message): def request(message):
bot.send_message(message.from_user.id, 'Отправь мне сообщение и я перешлю его разработчику\ send_message(message.from_user.id, 'Отправь мне сообщение и я перешлю его разработчику\
\n(или напиши stop, чтобы отменить отправку)', parse_mode='Markdown') \n(или напиши stop, чтобы отменить отправку)')
bot.register_next_step_handler(message, send_request) bot.register_next_step_handler(message, send_request)
return return
def send_request(message): def send_request(message):
if message.text == "stop" or message.text == "стоп" or message.text[0] == '/': if message.text == "stop" or message.text == "стоп" or message.text[0] == '/':
bot.send_message(message.from_user.id, 'Отмена отпраки', parse_mode='Markdown') send_message(message.from_user.id, 'Отмена отпраки')
return return
infos = [ infos = [
@@ -166,110 +330,78 @@ def send_request(message):
for i in range(len(infos)): for i in range(len(infos)):
if type(infos[i]) == type(None): if type(infos[i]) == type(None):
infos[i] = '' infos[i] = ''
if '_' in str(infos[i]):
infos[i] = str(infos[i]).replace('_', '\_')
text = '🛑 Сообщение от {} {} (@{}):\n\n{}\nid: {}'.format(infos[1], infos[2], infos[3], infos[4], infos[0]) admin_text = 'Сообщение от {} {} (@{}):\n\n{}\nid: {}'.format(infos[1], infos[2], infos[3], infos[4], infos[0])
bot.send_message(admin_id, text, parse_mode='Markdown') send_admin_message(admin_text)
bot.send_message(message.from_user.id, 'Ваше сообщение успешно доставлено!', parse_mode='Markdown')
send_message(message.from_user.id, 'Ваше сообщение успешно доставлено!')
return return
@bot.message_handler(commands=['schedule']) ### На доработке
def send_schedule(message):
# команда для отправки всего расписания
bot.send_message(message.chat.id, 'Пожалуйста, притворись, что ты получил сейчас своё расписание на неделю\
\n\n(Функция в разработке)', parse_mode='Markdown')
return
@bot.message_handler(commands=['timeout'])
def set_timeout(message):
bot.send_message(message.chat.id, 'Пришли мне число от 1 до 60. \
\nЭто будет количество минут, за которое я буду присылать тебе напоминание о уроке (По умолчанию: 10)', parse_mode='Markdown')
bot.register_next_step_handler(message, save_timeout)
return
def save_timeout(message):
if message.text[0] == '/':
return
if str(message.text).isdigit() and int(message.text) <= 60 and int(message.text) >= 1:
for_json.change_user_param(str(message.chat.id), 'timeout', str(message.text))
bot.send_message(message.chat.id, 'Хорошо, теперь ты будешь получать напоминания за {} минут до урока'.format(str(message.text)), parse_mode='Markdown')
else:
bot.send_message(message.chat.id, 'Пожалуйста, пришли число от 1 до 60. \nПо умолчанию: 10', parse_mode='Markdown')
bot.register_next_step_handler(message, save_timeout)
return
@bot.message_handler(commands=['info'])
def send_info(message):
if len(message.text.split(' ')) == 2 and str(message.from_user.id) == admin_id:
bot.send_message(message.chat.id, '🛑 Окей, держи', parse_mode='Markdown')
text = for_json.return_infos(message.text.split(' ')[1])
bot.send_message(message.chat.id, text, parse_mode=ParseMode.HTML)
return
bot.send_message(message.chat.id, 'Хорошо, вот твои настройки:', parse_mode='Markdown')
text = for_json.return_infos(str(message.chat.id))
bot.send_message(message.chat.id, text, parse_mode=ParseMode.HTML)
return
@bot.message_handler(commands=['source']) @bot.message_handler(commands=['source'])
def send_source(message): def send_source(message):
bot.send_message(message.chat.id, 'https://github.com/kr0sh512/Telegram-bot-schedule', parse_mode='Markdown') bot.send_message(message.chat.id, 'https://github.com/kr0sh512/Telegram-bot-schedule', parse_mode=ParseMode.HTML)
return return
@bot.message_handler(commands=['thread'])
def change_thread(message):
thread_id = ''
try:
thread_id = message.reply_to_message.message_thread_id
except AttributeError:
thread_id = "General"
for_json.change_user_param(str(message.chat.id), 'thread', thread_id)
bot.send_message(message.chat.id, 'Хорошо, теперь я буду отправлять сообщения в этот чат',
parse_mode='Markdown', message_thread_id=thread_id)
return
@bot.message_handler(commands=['pause'])
def pause_schedule(message):
for_json.change_user_param(str(message.chat.id), 'allow_message', 'no')
bot.send_message(message.chat.id, 'Рассылка сообщений преращена. \
\nДля возобновления воспользуйтесь командой\n/start', parse_mode='Markdown')
return
@bot.message_handler(content_types=['text']) @bot.message_handler(content_types=['text'])
def text_message(message): def text_message(message):
if message.chat.type == "supergroup": if message.chat.type == "supergroup":
return return
bot.send_message(message.from_user.id, 'К сожалению, я ещё не умею обрабатывать сообщения.\ send_message(message.from_user.id, 'К сожалению, я ещё не умею обрабатывать сообщения.\
\nИспользуй команды из меню или напиши /help.', parse_mode='Markdown') \nИспользуй команды из меню или напиши /help.')
return return
def send_message(id, text, thread_id='General'): def send_message(id, text, thread_id='General'):
if thread_id == 'General': if thread_id == 'General':
thread_id = None thread_id = None
bot.send_message(id, text, parse_mode=ParseMode.HTML, message_thread_id=thread_id)
try:
bot.send_message(chat_id=id, text=text, parse_mode=ParseMode.HTML, message_thread_id=thread_id,disable_web_page_preview=True)
except Exception as e:
time.sleep(5)
try:
bot.send_message(chat_id=id, text=text, parse_mode=ParseMode.HTML, message_thread_id=thread_id,disable_web_page_preview=True)
except Exception as e:
text_error = 'Error from user: <code>{}</code>\n{}'.format(id, str(e))
send_admin_message(text_error)
print(id, e)
return
def send_document(id, file, text = ''):
try:
bot.send_document(id, file, caption=text)
except Exception as e:
time.sleep(5)
try:
bot.send_document(id, file, caption=text)
except Exception as e:
text_error = 'Error from user: <code>{}</code>\n{}'.format(id, str(e))
send_admin_message(text_error)
print(id, e)
return return
if __name__ == '__main__': if __name__ == '__main__':
for_json.create_schedule_tasks() for_json.create_schedule_tasks()
send_message(admin_id, '🛑 я перезапустился!')
send_admin_message('Я перезапустился!')
print("-------------------------") print("-------------------------")
threading.Thread(target=bot.infinity_polling, name='bot_infinity_polling', daemon=True).start() threading.Thread(target=bot.infinity_polling, name='bot_infinity_polling', daemon=True).start()
while True: while True:
try: try:
# bot.polling(none_stop=True)
schedule.run_pending() schedule.run_pending()
time.sleep(5) time.sleep(5)
except Exception as e: except Exception as e: