# commands.py
def register_commands(bot):
# функция register_commands должна присутствовать в каждом файле,
# и содержать вложенные объявления обработчиков событий.
# bot - объект бота, на котором регаются обработчики.
# таким же способом можно пробросить другие глобальные объекты программы.
# очень важно, чтобы функция вызывалась РОВНО один раз в программе!
# дальше пошли обработчики...
@bot.message_handler(commands=['version'])
def version_message(message):
bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')
import commands
import weather
bot = telebot.TeleBot(.................)
# заставляем модули объявить и зарегистрировать свои обработчики
commands.register_commands(bot)
weather.register_commands(bot)
# дальше идут местные обработчики
@bot.message_handler(content_types=['text'])
def send_text(message):
if message.text.lower() in a:
bot.send_message(message.chat.id, 'Привет, создатель')
elif message.text.lower() =='ghbdtn':
bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
elif message.text.lower() in b:
bot.send_message(message.chat.id, 'Прощай, создатель ')
# ну и запускаем бота
bot.infinity_polling()
stop_polling_site = None # контролирует, продолжаем мы проверять новости или нет
async def get_news(message: types.Message):
"Эта функция только проверяет и отправляет новости, она не является обработчиком событий"
fresh_news = chek_news_update() # ты выполняешь сетевую операцию синхронно. Зачем?!
if len(fresh_news) >= 1:
for k, v in sorted(fresh_news.items()):
news = f'{hcode(v["dates_id_print"])}\n' \
f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'
await message.answer(news) # <<< не лучший способ отправлять сообщения в канал, но это твое дело.
print('ok news')
else:
print('no')
@dp.message_handler(commands='startnews')
async def start_polling_news(message: types.Message):
"Эта функция обрабатывает команду для начала опроса и реализует цикл опроса."
global stop_polling_site
if stop_polling_site is not None:
await message.answer("Мы уже проверяем новости.")
return
stop_polling_site = asyncio.Event()
while True: # цикл опроса новостей
try:
# реализуем ожидание без остановки остального бота. Таймаут - сколько ждем в секундах.
# такой подход используется вместо asyncio.sleep(),
# чтобы можно было в любой момент остановить опрос новостей.
await asyncio.wait_for(stop_polling_site.wait(), timeout=600)
except asyncio.TimeoutError:
# дождались таймаута - работаем.
try:
await get_news(message)
except:
pass # была ошибка при получении новостей, думай сам что тут делать
else:
# таймаута не было - значит, поступила команда на остановку цикла
break
stop_polling_site = None
@dp.message_handler(commands='stopnews')
async def stop_polling_news(message: types.Message):
"Эта функция обрабатывает команду для окончания опроса."
global stop_polling_site
if stop_polling_site is None:
# цикл и так не работает
await message.answer("Мы и так не проверяем новости.")
else:
# говорим остановить цикл
stop_polling_site.set()
wb = openpyxl.load_workbook(wb)
, но это явно не оно.class MainApp(App):
def build(self):
main_layout = FloatLayout()
# INSERT CODE HERE
return main_layout
if __name__ == '__main__':
app = MainApp()
app.run()
with open('file.py', 'rt', encoding='utf-8') as src:
data = src.read()
with open('file2.py', 'wt', encoding='utf-8') as dest:
dest.write(data.replace('# INSERT CODE HERE', 'тут твой код'))
from collections import Counter
counts = Counter(reaction.emoji for reaction in message.reactions)
if counts['✅'] > counts['❌']:
KABOOM()
connect.row_factory = sqlite3.Row
cursor.execute("""SELECT OrderNumber FROM orders ORDER BY OrderNumber DESC LIMIT 1;""")
row = cursor.fetchone()
ID = row['OrderNumber']
@app.on_message(filters.text)
def message(client, message):
msg = message.text
decorator = app.on_message(filters.text)
def message(client, message):
msg = message.text
# функция заменяется на результат работы декоратора - на ту же самую или другую функцию
message = decorator(message)