# 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()
Return type: Permissions
Wraps up the Discord permission value.
The properties provided are two way. You can set and retrieve individual bits using the properties as if they were regular bools. This allows you to edit permissions.
if perm.manage_channels:
The emoji may be a unicode emoji or a custom guild Emoji.
echo -e "\e[?1000;1006;1015h" # Enable tracking
echo -e "\e[?1000;1006;1015l" # Disable tracking
Mouse click looks like \e[<0;3;21M and a release \e[<0;3;21m. Where 3 is x and 21 is y, from top-left 1-based. (Note that it is x-y and not row-col).
echo -e '\e]8;;http://example.com\aThis is a link\e]8;;\a'
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', 'тут твой код'))