diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..2f5bdf0
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+* text=auto eol=lf
+*.db binary
diff --git a/bot.py b/bot.py
index 9cf320e..1479464 100644
--- a/bot.py
+++ b/bot.py
@@ -1,262 +1,262 @@
-import config, asyncio, info
-import logging, pymorphy2, time
-
-from aiogram import Bot, Dispatcher, executor, types
-from sql import SQLighter
-from datetime import datetime as dt
-
-# задаем уровень логов
-logging.basicConfig(level=logging.INFO)
-
-# инициализируем бота
-bot = Bot(token=config.API_TOKEN)
-dp = Dispatcher(bot)
-keyboard = types.InlineKeyboardMarkup()
-morph = pymorphy2.MorphAnalyzer()
-
-# инициализируем соединение с БД
-db = SQLighter('sub.db')
-
-
-# СТАРТОВЫЕ КОМАНДЫ
-@dp.message_handler(commands=['start'])
-async def start(message: types.Message):
- if not db.user_exists(message.from_user.id):
- # если юзера нет в базе, добавляем его
- db.add_user(message.from_user.id)
-
- buttons = [types.InlineKeyboardButton(text="1-я смена", callback_data="prt1"),
- types.InlineKeyboardButton(text="2-я смена", callback_data="prt2")]
-
- keyboard = types.InlineKeyboardMarkup(row_width=2)
- keyboard.add(*buttons)
-
- await message.answer(f"Привет, {message.from_user.first_name}!\nЯ - погодный бот, созданный для выдачи информации о"
- f" вероятных актировках. Прошу вас выбрать вашу смену обучения!\n\nДля последующей "
- f"смены: города или смены обучения воспользуйтесь командой /town",
- parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
-
-
-@dp.message_handler(content_types=['sticker'])
-async def stick(message: types.Message):
- print(message.sticker.file_id)
-
-
-@dp.message_handler(commands=['town'])
-async def town(message: types.Message):
-
- buttons = [types.InlineKeyboardButton(text="1-я смена", callback_data="prt1"),
- types.InlineKeyboardButton(text="2-я смена", callback_data="prt2")]
-
- keyboard = types.InlineKeyboardMarkup(row_width=2)
- keyboard.add(*buttons)
-
- await message.answer("Прошу вас выбрать вашу смену обучения!", parse_mode=types.ParseMode.HTML,
- reply_markup=keyboard)
-
-
-# ИЛАЙН КЛАВИАТУРА
-@dp.callback_query_handler(text="prt1")
-async def part_one(call: types.CallbackQuery):
- db.update_user(call.message.chat.id, 3, 1)
-
- buttons = [types.InlineKeyboardButton(text="Норильск", callback_data="nor"),
- types.InlineKeyboardButton(text="Талнах", callback_data="tal"),
- types.InlineKeyboardButton(text="Оганер", callback_data="oga"),
- types.InlineKeyboardButton(text="Каеркан", callback_data="kae")]
-
- keyboard = types.InlineKeyboardMarkup(row_width=2)
- keyboard.add(*buttons)
-
- await call.message.answer(text="Отлично! Теперь вам надо выбрать район в котором вы проживаете "
- "на территории НПР!",
- parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
-
-
-@dp.callback_query_handler(text="prt2")
-async def part_two(call: types.CallbackQuery):
- db.update_user(call.message.chat.id, 3, 2)
-
- buttons = [types.InlineKeyboardButton(text="Норильск", callback_data="nor"),
- types.InlineKeyboardButton(text="Талнах", callback_data="tal"),
- types.InlineKeyboardButton(text="Оганер", callback_data="oga"),
- types.InlineKeyboardButton(text="Каеркан", callback_data="kae")]
-
- keyboard = types.InlineKeyboardMarkup(row_width=2)
- keyboard.add(*buttons)
-
- await call.message.answer(text="Конечно я вам не завидую, но куда деваться) Теперь вам надо выбрать "
- "район в котором вы проживаете на территории НПР!",
- parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
-
-
-@dp.callback_query_handler(text=["nor", "tal", "oga", "kae"])
-async def function(call: types.CallbackQuery):
- txt = call.data
- if txt == "nor":
- db.update_user(call.message.chat.id, 4, 1)
- elif txt == "tal":
- db.update_user(call.message.chat.id, 4, 2)
- elif txt == "oga":
- db.update_user(call.message.chat.id, 4, 3)
- elif txt == "kae":
- db.update_user(call.message.chat.id, 4, 4)
-
- await call.message.answer(text='Прекрасно! Вы заполнили данные, теперь если вы хотите подписаться на '
- 'утреннюю рассылку об актировках воспользуйтесь командой /letter.\n\n'
- 'Для полного ознакомления можете воспользоваться командой /help',
- parse_mode=types.ParseMode.HTML)
-
-
-# КОМАНДЫ АКТИВАЦИИ ПОДПИСОК
-@dp.message_handler(commands=['notice'])
-async def notification(message: types.Message):
- if str(message.chat.id) not in db.get_send():
- db.update_user(message.chat.id, 2, 1)
- await message.answer("Увидомление приходит каждый день не зависимо от наличия актировки!")
- else:
- db.update_user(message.chat.id, 2, 0)
- await message.answer("Уведомление приходит, только если есть актировка!")
-
-
-@dp.message_handler(commands=['letter'])
-async def letter(message: types.Message):
- if str(message.chat.id) not in db.get_subs():
- db.update_user(message.chat.id, 1, 1)
- await message.answer("Вы подписались на рассылку!")
- else:
- db.update_user(message.chat.id, 1, 0)
- await message.answer("Вы отписались от расслыки!")
-
-
-@dp.message_handler(commands=['storm'])
-async def storm(message: types.Message):
- await message.answer(info.storm(), parse_mode=types.ParseMode.MARKDOWN)
-
-
-@dp.message_handler(commands=['acta'])
-async def act(message: types.Message):
- mail = f"Актировка за {'.'.join(reversed(str(db.get_data()[0]).split('-')))}\n"
-
- for part in [1, 2]:
- mail = mail + f"\nДля {part}-ой смены:\n"
- if db.check_acta(part):
- cities = config.NAMES
- city = db.get_acta(part)
-
- for i, town in enumerate(city):
- if str(town) != "нет":
- mail = mail + f"* В {morph.parse(cities[i])[0].inflect({'loct'}).word.title()} актировка " \
- f"с 1 по {town} классы!\n"
- else:
- mail = mail + f"* В {morph.parse(cities[i])[0].inflect({'loct'}).word.title()} актировки нет!\n"
-
- else:
- mail = mail + "На данный момент информации на сайте нету!\n\n"
- await message.answer(mail, parse_mode=types.ParseMode.HTML)
-
-
-@dp.message_handler(commands=['weather'])
-async def storm(message: types.Message):
- text = message.text.split()
- try:
- day = int(text[1])
- if 0 <= day <= 9:
- weather = db.get_weather(day)
-
- txt = "Погода:\n\n"
- for hour in weather:
- dat = weather[hour]
- if len(dat[1]) == 2:
- par = f"{dat[1][0]}-{dat[1][1]}"
- else:
- par = str(dat[1][0])
- txt = txt + f"В {hour}:\n Температура: {dat[0]}\n Скорость и порывы ветра: {par}\n Направление ветра: {dat[2]}\n Осадки: {dat[3]}\n\n"
-
- await message.answer(txt, parse_mode=types.ParseMode.HTML)
- else:
- raise NameError('Число не вподходящем диапозоне!')
- except Exception:
- await message.answer("Введи число дня по счёту от сегодня, погода которого тебе нужна!\n\nТо есть:\nСегодня - {/waether 0}\nЗавтра - {/weather 1}",
- parse_mode=types.ParseMode.MARKDOWN)
-
-
-@dp.message_handler(commands=['help'])
-async def main(message: types.Message):
- await message.answer('*Инструкция использования:*\n\n'
- '*/town* - с помощью этой команды вы можете изменить данные о городе и смене обучения\n'
- '*/acta* - команда, выдающая данные об актировке на все города на данный момент\n'
- '*/storm* - команда, выдающая данные о штормовом предупреждении\n'
- '*/letter* - команда, позваляющая подписаться на утреннюю рассылку о наличии актировки\n'
- '*/notice* - команда, дающая выбор - получать уведомления в любом случае или только при '
- 'наличии актировки\n', types.ParseMode.MARKDOWN)
-
-
-# УВЕДОМЛЕНИЕ
-async def timer(wait_for):
- while True:
- await asyncio.sleep(wait_for)
- city, part = info.act()
-
- if city:
- date_old, part_old = db.get_data()
- date_now, part_num = str(dt.now().date()), int(part[0])
-
- if (part_num == 1 and date_old != date_now) or (part_num == 2 and date_old == date_now):
- if part_old != part_num:
- db.update_data(dt.now().date(), part_num)
- db.save_acta(city, part_num)
- for twn in city:
- town = morph.parse(twn[0][1])[0].inflect({'datv'}).word
- if isinstance(twn[1], int):
- for s in db.get_users(part_num, twn[0][0]):
- try:
- await bot.send_sticker(chat_id=s, sticker=config.ID_STICKERS + config.STICKERS[1])
- await bot.send_message(chat_id=s, text=f"*Для {part} по {town.title()} объявлена актировка c 1 по {twn[1]} классы!*",
- parse_mode=types.ParseMode.MARKDOWN)
- except Exception as e:
- print(repr(e))
- db.update_status(s)
- else:
- for s in db.get_sends(part_num, twn[0][0]):
- try:
- await bot.send_sticker(chat_id=s, sticker=config.ID_STICKERS + config.STICKERS[6])
- await bot.send_message(chat_id=s, text=f"*Для {part} по {town.title()} актировка отсутствует!",
- parse_mode=types.ParseMode.MARKDOWN)
- except Exception as e:
- print(repr(e))
- db.update_status(s)
- print("---------------------------------")
-
-
-# ОБНОВЛЕНИЕ ДАННЫХ О ПОГОДЫ
-async def wind(wait_for):
- while True:
- await asyncio.sleep(wait_for)
- for moment in db.get_moments():
- weather = info.weather(moment)
-
- if type(weather) == dict:
- for tm in weather:
- db.update_weather(weather[tm], moment, tm)
- else:
- print(weather)
- time.sleep(10)
-
-
-# ОЧИСТКА ДАННЫХ ОБ АКТИРОВКАХ
-async def clear(wait_for):
- while True:
- await asyncio.sleep(wait_for)
-
- if (db.get_data()[0] != str(dt.now().date())) and (db.check_acta(1) or db.check_acta(2)):
- db.del_acta()
-
-
-# ЗАПУСК ЛОНГ ПОЛЛИНГА
-if __name__ == '__main__':
- loop = asyncio.get_event_loop()
- loop.create_task(timer(60)) # ПРОВЕРКА МЕТЕО НОРИЛЬСК КАЖДУЮ МИНУТУ
- loop.create_task(clear(300)) # ПРОВЕРКА НА НОВЫЙ ДЕНЬ КАЖДЫЕ 10 МИНУТ
- loop.create_task(wind(1200)) # ПРОВЕРКА НА ОБНОВЛЕНИЕ ПОГОДЫ КАЖДЫЕ 20 МИНУТ
- executor.start_polling(dp, skip_updates=True)
+import config, asyncio, info
+import logging, pymorphy2, time
+
+from aiogram import Bot, Dispatcher, executor, types
+from sql import SQLighter
+from datetime import datetime as dt
+
+# задаем уровень логов
+logging.basicConfig(level=logging.INFO)
+
+# инициализируем бота
+bot = Bot(token=config.API_TOKEN)
+dp = Dispatcher(bot)
+keyboard = types.InlineKeyboardMarkup()
+morph = pymorphy2.MorphAnalyzer()
+
+# инициализируем соединение с БД
+db = SQLighter('sub.db')
+
+
+# СТАРТОВЫЕ КОМАНДЫ
+@dp.message_handler(commands=['start'])
+async def start(message: types.Message):
+ if not db.user_exists(message.from_user.id):
+ # если юзера нет в базе, добавляем его
+ db.add_user(message.from_user.id)
+
+ buttons = [types.InlineKeyboardButton(text="1-я смена", callback_data="prt1"),
+ types.InlineKeyboardButton(text="2-я смена", callback_data="prt2")]
+
+ keyboard = types.InlineKeyboardMarkup(row_width=2)
+ keyboard.add(*buttons)
+
+ await message.answer(f"Привет, {message.from_user.first_name}!\nЯ - погодный бот, созданный для выдачи информации о"
+ f" вероятных актировках. Прошу вас выбрать вашу смену обучения!\n\nДля последующей "
+ f"смены: города или смены обучения воспользуйтесь командой /town",
+ parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
+
+
+@dp.message_handler(content_types=['sticker'])
+async def stick(message: types.Message):
+ print(message.sticker.file_id)
+
+
+@dp.message_handler(commands=['town'])
+async def town(message: types.Message):
+
+ buttons = [types.InlineKeyboardButton(text="1-я смена", callback_data="prt1"),
+ types.InlineKeyboardButton(text="2-я смена", callback_data="prt2")]
+
+ keyboard = types.InlineKeyboardMarkup(row_width=2)
+ keyboard.add(*buttons)
+
+ await message.answer("Прошу вас выбрать вашу смену обучения!", parse_mode=types.ParseMode.HTML,
+ reply_markup=keyboard)
+
+
+# ИЛАЙН КЛАВИАТУРА
+@dp.callback_query_handler(text="prt1")
+async def part_one(call: types.CallbackQuery):
+ db.update_user(call.message.chat.id, 3, 1)
+
+ buttons = [types.InlineKeyboardButton(text="Норильск", callback_data="nor"),
+ types.InlineKeyboardButton(text="Талнах", callback_data="tal"),
+ types.InlineKeyboardButton(text="Оганер", callback_data="oga"),
+ types.InlineKeyboardButton(text="Каеркан", callback_data="kae")]
+
+ keyboard = types.InlineKeyboardMarkup(row_width=2)
+ keyboard.add(*buttons)
+
+ await call.message.answer(text="Отлично! Теперь вам надо выбрать район в котором вы проживаете "
+ "на территории НПР!",
+ parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
+
+
+@dp.callback_query_handler(text="prt2")
+async def part_two(call: types.CallbackQuery):
+ db.update_user(call.message.chat.id, 3, 2)
+
+ buttons = [types.InlineKeyboardButton(text="Норильск", callback_data="nor"),
+ types.InlineKeyboardButton(text="Талнах", callback_data="tal"),
+ types.InlineKeyboardButton(text="Оганер", callback_data="oga"),
+ types.InlineKeyboardButton(text="Каеркан", callback_data="kae")]
+
+ keyboard = types.InlineKeyboardMarkup(row_width=2)
+ keyboard.add(*buttons)
+
+ await call.message.answer(text="Конечно я вам не завидую, но куда деваться) Теперь вам надо выбрать "
+ "район в котором вы проживаете на территории НПР!",
+ parse_mode=types.ParseMode.HTML, reply_markup=keyboard)
+
+
+@dp.callback_query_handler(text=["nor", "tal", "oga", "kae"])
+async def function(call: types.CallbackQuery):
+ txt = call.data
+ if txt == "nor":
+ db.update_user(call.message.chat.id, 4, 1)
+ elif txt == "tal":
+ db.update_user(call.message.chat.id, 4, 2)
+ elif txt == "oga":
+ db.update_user(call.message.chat.id, 4, 3)
+ elif txt == "kae":
+ db.update_user(call.message.chat.id, 4, 4)
+
+ await call.message.answer(text='Прекрасно! Вы заполнили данные, теперь если вы хотите подписаться на '
+ 'утреннюю рассылку об актировках воспользуйтесь командой /letter.\n\n'
+ 'Для полного ознакомления можете воспользоваться командой /help',
+ parse_mode=types.ParseMode.HTML)
+
+
+# КОМАНДЫ АКТИВАЦИИ ПОДПИСОК
+@dp.message_handler(commands=['notice'])
+async def notification(message: types.Message):
+ if str(message.chat.id) not in db.get_send():
+ db.update_user(message.chat.id, 2, 1)
+ await message.answer("Увидомление приходит каждый день не зависимо от наличия актировки!")
+ else:
+ db.update_user(message.chat.id, 2, 0)
+ await message.answer("Уведомление приходит, только если есть актировка!")
+
+
+@dp.message_handler(commands=['letter'])
+async def letter(message: types.Message):
+ if str(message.chat.id) not in db.get_subs():
+ db.update_user(message.chat.id, 1, 1)
+ await message.answer("Вы подписались на рассылку!")
+ else:
+ db.update_user(message.chat.id, 1, 0)
+ await message.answer("Вы отписались от расслыки!")
+
+
+@dp.message_handler(commands=['storm'])
+async def storm(message: types.Message):
+ await message.answer(info.storm(), parse_mode=types.ParseMode.MARKDOWN)
+
+
+@dp.message_handler(commands=['acta'])
+async def act(message: types.Message):
+ mail = f"Актировка за {'.'.join(reversed(str(db.get_data()[0]).split('-')))}\n"
+
+ for part in [1, 2]:
+ mail = mail + f"\nДля {part}-ой смены:\n"
+ if db.check_acta(part):
+ cities = config.NAMES
+ city = db.get_acta(part)
+
+ for i, town in enumerate(city):
+ if str(town) != "нет":
+ mail = mail + f"* В {morph.parse(cities[i])[0].inflect({'loct'}).word.title()} актировка " \
+ f"с 1 по {town} классы!\n"
+ else:
+ mail = mail + f"* В {morph.parse(cities[i])[0].inflect({'loct'}).word.title()} актировки нет!\n"
+
+ else:
+ mail = mail + "На данный момент информации на сайте нету!\n\n"
+ await message.answer(mail, parse_mode=types.ParseMode.HTML)
+
+
+@dp.message_handler(commands=['weather'])
+async def storm(message: types.Message):
+ text = message.text.split()
+ try:
+ day = int(text[1])
+ if 0 <= day <= 9:
+ weather = db.get_weather(day)
+
+ txt = "Погода:\n\n"
+ for hour in weather:
+ dat = weather[hour]
+ if len(dat[1]) == 2:
+ par = f"{dat[1][0]}-{dat[1][1]}"
+ else:
+ par = str(dat[1][0])
+ txt = txt + f"В {hour}:\n Температура: {dat[0]}\n Скорость и порывы ветра: {par}\n Направление ветра: {dat[2]}\n Осадки: {dat[3]}\n\n"
+
+ await message.answer(txt, parse_mode=types.ParseMode.HTML)
+ else:
+ raise NameError('Число не вподходящем диапозоне!')
+ except Exception:
+ await message.answer("Введи число дня по счёту от сегодня, погода которого тебе нужна!\n\nТо есть:\nСегодня - {/waether 0}\nЗавтра - {/weather 1}",
+ parse_mode=types.ParseMode.MARKDOWN)
+
+
+@dp.message_handler(commands=['help'])
+async def main(message: types.Message):
+ await message.answer('*Инструкция использования:*\n\n'
+ '*/town* - с помощью этой команды вы можете изменить данные о городе и смене обучения\n'
+ '*/acta* - команда, выдающая данные об актировке на все города на данный момент\n'
+ '*/storm* - команда, выдающая данные о штормовом предупреждении\n'
+ '*/letter* - команда, позваляющая подписаться на утреннюю рассылку о наличии актировки\n'
+ '*/notice* - команда, дающая выбор - получать уведомления в любом случае или только при '
+ 'наличии актировки\n', types.ParseMode.MARKDOWN)
+
+
+# УВЕДОМЛЕНИЕ
+async def timer(wait_for):
+ while True:
+ await asyncio.sleep(wait_for)
+ city, part = info.act()
+
+ if city:
+ date_old, part_old = db.get_data()
+ date_now, part_num = str(dt.now().date()), int(part[0])
+
+ if (part_num == 1 and date_old != date_now) or (part_num == 2 and date_old == date_now):
+ if part_old != part_num:
+ db.update_data(dt.now().date(), part_num)
+ db.save_acta(city, part_num)
+ for twn in city:
+ town = morph.parse(twn[0][1])[0].inflect({'datv'}).word
+ if isinstance(twn[1], int):
+ for s in db.get_users(part_num, twn[0][0]):
+ try:
+ await bot.send_sticker(chat_id=s, sticker=config.ID_STICKERS + config.STICKERS[1])
+ await bot.send_message(chat_id=s, text=f"*Для {part} по {town.title()} объявлена актировка c 1 по {twn[1]} классы!*",
+ parse_mode=types.ParseMode.MARKDOWN)
+ except Exception as e:
+ print(repr(e))
+ db.update_status(s)
+ else:
+ for s in db.get_sends(part_num, twn[0][0]):
+ try:
+ await bot.send_sticker(chat_id=s, sticker=config.ID_STICKERS + config.STICKERS[6])
+ await bot.send_message(chat_id=s, text=f"*Для {part} по {town.title()} актировка отсутствует!",
+ parse_mode=types.ParseMode.MARKDOWN)
+ except Exception as e:
+ print(repr(e))
+ db.update_status(s)
+ print("---------------------------------")
+
+
+# ОБНОВЛЕНИЕ ДАННЫХ О ПОГОДЫ
+async def wind(wait_for):
+ while True:
+ await asyncio.sleep(wait_for)
+ for moment in db.get_moments():
+ weather = info.weather(moment)
+
+ if type(weather) == dict:
+ for tm in weather:
+ db.update_weather(weather[tm], moment, tm)
+ else:
+ print(weather)
+ time.sleep(10)
+
+
+# ОЧИСТКА ДАННЫХ ОБ АКТИРОВКАХ
+async def clear(wait_for):
+ while True:
+ await asyncio.sleep(wait_for)
+
+ if (db.get_data()[0] != str(dt.now().date())) and (db.check_acta(1) or db.check_acta(2)):
+ db.del_acta()
+
+
+# ЗАПУСК ЛОНГ ПОЛЛИНГА
+if __name__ == '__main__':
+ loop = asyncio.get_event_loop()
+ loop.create_task(timer(60)) # ПРОВЕРКА МЕТЕО НОРИЛЬСК КАЖДУЮ МИНУТУ
+ loop.create_task(clear(300)) # ПРОВЕРКА НА НОВЫЙ ДЕНЬ КАЖДЫЕ 10 МИНУТ
+ loop.create_task(wind(1200)) # ПРОВЕРКА НА ОБНОВЛЕНИЕ ПОГОДЫ КАЖДЫЕ 20 МИНУТ
+ executor.start_polling(dp, skip_updates=True)
diff --git a/config.py b/config.py
index 17011c9..73b8157 100644
--- a/config.py
+++ b/config.py
@@ -1,19 +1,19 @@
-API_TOKEN = 'token from BotFather' # ОСНОВНОЙ
-# API_TOKEN = 'token from BotFather' # ТЕСТЫ
-
-CITY = {'Центральный район': [1, 'Норильск'], 'район Талнах': [2, 'Талнах'],
- 'ж/о Оганер': [3, 'Оганер'], 'район Кайеркан': [4, 'Кайеркан']}
-
-NAMES = ['Норильск', 'Талнах', 'Оганер', 'Кайеркан']
-
-TIME = [1, 4, 7, 10, 13, 16, 19, 22]
-
-ID_STICKERS = r"CAACAgIAAxkBAAID"
-STICKERS = {"пасмурно": r"2mIKSBBtFNR1uHLhdztkhVwqTxRRAAKHEgACljNZSAgtQYHfmE4WIwQ", # облако
- "поземок": r"22IKSBIdUSxApfTAEk5mMjldDexZAAIPFwAClIBRSCSyRnG71n6CIwQ", # солнце и облако
- 1: r"3GIKSBRW4sCgYX8AAaq01U6DaNF1IwACXhMAAlzDUUirRDtYEkGJ3iME", # ветер
- 4: r"3WIKSBec5Ch8vL-czNkXikARo-JmAALmFAACGHZRSHmiNc0n7VZPIwQ", # гроза
- "снег": r"3mIKSBpHLfkJOnI4HCQny_a_XSVbAAI8FAACSixRSN7lm05cAAEj0yME", # снегопад
- 6: r"32IKSByANsmxbok8VePu7k6mTzexAALMFgACVopQSHXJa0spfMe7IwQ"} # ясно
-
-# await message.answer_sticker(ID_STICKERS + STICKERS[1])
+API_TOKEN = 'token from BotFather' # ОСНОВНОЙ
+# API_TOKEN = 'token from BotFather' # ТЕСТЫ
+
+CITY = {'Центральный район': [1, 'Норильск'], 'район Талнах': [2, 'Талнах'],
+ 'ж/о Оганер': [3, 'Оганер'], 'район Кайеркан': [4, 'Кайеркан']}
+
+NAMES = ['Норильск', 'Талнах', 'Оганер', 'Кайеркан']
+
+TIME = [1, 4, 7, 10, 13, 16, 19, 22]
+
+ID_STICKERS = r"CAACAgIAAxkBAAID"
+STICKERS = {"пасмурно": r"2mIKSBBtFNR1uHLhdztkhVwqTxRRAAKHEgACljNZSAgtQYHfmE4WIwQ", # облако
+ "поземок": r"22IKSBIdUSxApfTAEk5mMjldDexZAAIPFwAClIBRSCSyRnG71n6CIwQ", # солнце и облако
+ 1: r"3GIKSBRW4sCgYX8AAaq01U6DaNF1IwACXhMAAlzDUUirRDtYEkGJ3iME", # ветер
+ 4: r"3WIKSBec5Ch8vL-czNkXikARo-JmAALmFAACGHZRSHmiNc0n7VZPIwQ", # гроза
+ "снег": r"3mIKSBpHLfkJOnI4HCQny_a_XSVbAAI8FAACSixRSN7lm05cAAEj0yME", # снегопад
+ 6: r"32IKSByANsmxbok8VePu7k6mTzexAALMFgACVopQSHXJa0spfMe7IwQ"} # ясно
+
+# await message.answer_sticker(ID_STICKERS + STICKERS[1])
diff --git a/info.py b/info.py
index acafc7d..2c2762e 100644
--- a/info.py
+++ b/info.py
@@ -1,77 +1,77 @@
-# - * - coding: utf-8 - * -
-from selenium import webdriver
-from selenium.webdriver.chrome.options import Options
-
-from bs4 import BeautifulSoup
-import requests, config
-
-
-def act():
- try:
- soup = BeautifulSoup(requests.get('https://www.norilsk-city.ru/meteo/').text, 'html.parser')
- acta = [list(map(lambda x: x.get_text(), _.find_all("p"))) for _ in soup.find_all("tbody")[0] if _ != "\n"]
- count = '1-ой смены' if "1" in str(soup.find_all("div",
- class_="textContent",
- limit=1)[0].find_all("p",
- limit=1)[0].get_text()) else '2-ой смены'
-
- for lst in acta:
- if "нет" in lst[1]:
- acta[acta.index(lst)] = [config.CITY[lst[0]], "нет"]
- else:
- acta[acta.index(lst)] = [config.CITY[lst[0]], int(lst[1].split("-")[1].split()[0])]
-
- return sorted(acta), count
- except Exception as e:
- return [], ""
-
-
-def storm():
- soup = BeautifulSoup(requests.get('https://www.norilsk-city.ru/meteo/').text, 'html.parser')
- message = str(str(soup.find_all("p")[13])[35:-40])
- stm = "*" + str(str(soup.find_all("h2")[1])[4:-5]) + \
- "*\n\n" + message[:-67] + " " + message[96:-36] + message[118:-24] + message[129:-1]
- return stm
-
-
-def weather(moment):
- try:
- # путь к драйверу chrome
- chrome_options = Options()
- chrome_options.add_argument("--headless")
- chrome_options.add_argument('--no-sandbox')
- chromedriver = 'chromedriver'
- browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_options)
-
- # После успешного входа в систему переходим на страницу «Gismeteo»
- browser.get(f'https://www.gismeteo.ru/weather-norilsk-3957/{moment}')
- # Получение HTML-содержимого
- requiredHtml = browser.page_source
-
- soup = BeautifulSoup(requiredHtml, 'html.parser')
-
- # weather = soup.find_all()
-
- temp = soup.find_all("span", class_="unit unit_temperature_c")[6:]
- wind = soup.find_all("span", class_=["wind-unit unit unit_wind_m_s", "wind-unit unit unit_wind_m_s warning"])[:8]
- dire = soup.find_all("div", class_="direction")
- prec = soup.find_all("div", class_="item-unit")
-
- k, s, weather = 0, 0, {}
-
- for i in range(8):
- par = wind[i].get_text().split()[0].split('-')
- if len(par) == 1:
- par = [int(par[0])]
- else:
- par = [int(par[0]), int(par[1])]
-
- pre = prec[i].get_text()
-
- # pre = prec[i].get_text().split('\n')
- # precti = pre[1].split(' ')[-1] if len(pre) > 1 else pre[0]
-
- weather[config.TIME[i]] = [temp[i].get_text(), par, dire[i].get_text(), pre]
- return weather
- except Exception as e:
+# - * - coding: utf-8 - * -
+from selenium import webdriver
+from selenium.webdriver.chrome.options import Options
+
+from bs4 import BeautifulSoup
+import requests, config
+
+
+def act():
+ try:
+ soup = BeautifulSoup(requests.get('https://www.norilsk-city.ru/meteo/').text, 'html.parser')
+ acta = [list(map(lambda x: x.get_text(), _.find_all("p"))) for _ in soup.find_all("tbody")[0] if _ != "\n"]
+ count = '1-ой смены' if "1" in str(soup.find_all("div",
+ class_="textContent",
+ limit=1)[0].find_all("p",
+ limit=1)[0].get_text()) else '2-ой смены'
+
+ for lst in acta:
+ if "нет" in lst[1]:
+ acta[acta.index(lst)] = [config.CITY[lst[0]], "нет"]
+ else:
+ acta[acta.index(lst)] = [config.CITY[lst[0]], int(lst[1].split("-")[1].split()[0])]
+
+ return sorted(acta), count
+ except Exception as e:
+ return [], ""
+
+
+def storm():
+ soup = BeautifulSoup(requests.get('https://www.norilsk-city.ru/meteo/').text, 'html.parser')
+ message = str(str(soup.find_all("p")[13])[35:-40])
+ stm = "*" + str(str(soup.find_all("h2")[1])[4:-5]) + \
+ "*\n\n" + message[:-67] + " " + message[96:-36] + message[118:-24] + message[129:-1]
+ return stm
+
+
+def weather(moment):
+ try:
+ # путь к драйверу chrome
+ chrome_options = Options()
+ chrome_options.add_argument("--headless")
+ chrome_options.add_argument('--no-sandbox')
+ chromedriver = 'chromedriver'
+ browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_options)
+
+ # После успешного входа в систему переходим на страницу «Gismeteo»
+ browser.get(f'https://www.gismeteo.ru/weather-norilsk-3957/{moment}')
+ # Получение HTML-содержимого
+ requiredHtml = browser.page_source
+
+ soup = BeautifulSoup(requiredHtml, 'html.parser')
+
+ # weather = soup.find_all()
+
+ temp = soup.find_all("span", class_="unit unit_temperature_c")[6:]
+ wind = soup.find_all("span", class_=["wind-unit unit unit_wind_m_s", "wind-unit unit unit_wind_m_s warning"])[:8]
+ dire = soup.find_all("div", class_="direction")
+ prec = soup.find_all("div", class_="item-unit")
+
+ k, s, weather = 0, 0, {}
+
+ for i in range(8):
+ par = wind[i].get_text().split()[0].split('-')
+ if len(par) == 1:
+ par = [int(par[0])]
+ else:
+ par = [int(par[0]), int(par[1])]
+
+ pre = prec[i].get_text()
+
+ # pre = prec[i].get_text().split('\n')
+ # precti = pre[1].split(' ')[-1] if len(pre) > 1 else pre[0]
+
+ weather[config.TIME[i]] = [temp[i].get_text(), par, dire[i].get_text(), pre]
+ return weather
+ except Exception as e:
return [repr(e)]
\ No newline at end of file