Skip to content

Instantly share code, notes, and snippets.

@Latand
Created December 13, 2020 13:23
Show Gist options
  • Save Latand/a437196983cd37750120ecfdac9d0c32 to your computer and use it in GitHub Desktop.
Save Latand/a437196983cd37750120ecfdac9d0c32 to your computer and use it in GitHub Desktop.
Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagination Pagin…
from .help import dp
from .start import dp
from .read_book import dp
from .read_manga import dp
from .show_items import dp
from .echo import dp
__all__ = ["dp"]
from random import randint
book = [
"""<a href="https://habr.com/ru/post/491764/">ИСТОЧНИК</a>
Доброго времени суток, уважаемое хабрасообщество! Как я и обещал после прошлой статьи по теории струн, сегодня мы попробуем приоткрыть завесу тайн и пробежаться по костылям новым веяниям в космологии — попробуем взглянуть на тернистый путь, который прошли ученые, и разобраться, к чему же они в конце концов пришли в попытке описать происхождение, жизнь и будущее нашей Вселенной. В процессе написания статья немало разрослась, поэтому я все-таки решил разделить её на две части.
""", # 1
"""<b>Космологическая постоянная</b>
В 1916 году Альберт Эйнштейн при создании общей теории относительности (ОТО) полагал, что наша Вселенная должна быть стационарной, то есть по большей части недвижной. Или, другими словами, расстояние между двумя разными звёздами и даже галактиками с течением времени должно оставаться одним и тем же. Однако из уравнений его же собственной теории выходило, что Вселенная по ним никак не может быть стационарной. Тогда Эйнштейн дополнил уравнения так называемым «лямбда-членом», который был призван гарантировать то, что Вселенная таки стационарна. Лямбда-член в дальнейшем назвали «космологической постоянной».
Практический смысл космологической постоянной заключался в том, что пустое пространство на самом деле не пустое — в нём имеется некое поле, которое оказывает воздействие на находящееся в нём вещество, извлекая нужную для этого энергию из ниоткуда. Подобные выводы вызывали у современников недоумение, и коллеги не преминули обрушиться на Эйнштейна с критикой.
""", # 2
"""В 1922 году Александр Фридман представил собственную модель Вселенной, которая не использовала космологическую постоянную. Но по его модели получалось, что Вселенная должна либо постоянно расширяться, либо постоянно сжиматься. Изначально Эйнштейн к данной модели отнесся отрицательно.
Но в 1929 году Эдвин Хаббл поставил точку в данном вопросе, экспериментально подтвердив, что Вселенная расширяется — то есть, расстояние между двумя любыми галактиками с течением времени постоянно увеличивается, а не остаётся неизменным. Эйнштейн признал свою неправоту, сказав, что введение космологической постоянной было его величайшей ошибкой.
Открытие расширяющейся Вселенной стало новым толчком для науки — привело к созданию теории Большого взрыва. Да и современная Лямбда-CDM модель Вселенной базируется именно на модели Фридмана, включая в себя помимо нее и космологическую постоянную, и тёмную материю, и тёмную энергию.
""", # 3
"""<b>Тёмная материя</b>
До 1998 года учёные усердно работали над теорией Большого взрыва, которая постепенно все больше и больше развивалась. Но общая суть оставалась неизменной: изначально вся материя была сосредоточена в одной-единственной точке, и много лет назад произошел Большой взрыв, дав начало нашей Вселенной.
Математически теория базировалась на ОТО, но она не была в состоянии описать все наблюдаемые явления. Например, было установлено, что края всех галактик вращаются гораздо быстрее, чем это следует из законов Ньютона, которые являются предельным случаем ОТО.
""", # 4
"""Объяснений этому явлению могло быть два: либо массы галактик больше, чем кажутся, либо гравитация убывает с расстоянием не так быстро, как предсказывает ОТО, а как-то очень хитро — не нарушая уже проверенные кейсы, но и объясняя кривые вращений галактик. В данном случае ученые остановились на первом варианте, и добавили к космологической модели недостающую массу, которую назвали «тёмной материей».
""", # 5
"""На тот момент у тёмной материи не было экспериментальных подтверждений, и для объяснения этого факта было предложено два варианта:
1. Тёмную материю просто не видно. Черные дыры, коричневые карлики, нейтронные звезды, кварковые звезды, преонные звезды, многочисленные планеты в телескоп не узреть на таких расстояниях, а они вполне себе обычные объекты во Вселенной. Хотя согласно различным космологическим теориям и наблюдениям за древними космическими объектами — так много подобных объектов быть не должно.
2. Тёмная материя состоит из невидимых частиц. Хотя сама возможность существования подобных частиц в науке сейчас под большим вопросом. Тем не менее тёмная материя должна состоять не только из слабо взаимодействующих, но и довольно массивных частиц. Подпадающие под такие характеристики частицы усиленно ищутся, но пока безуспешно.
""", # 6
"""На данный момент учёные предполагают, что если тёмная материя представляет собой некий новый тип частиц, то они могут, помимо гравитации, взаимодействовать ещё каким-либо образом (например, посредством слабого взаимодействия — того самого, из-за которого распадаются радиоактивные элементы). На практике это означает, что эти частицы могут рассеиваться на ядрах атомов; поэтому, если взять большое количество активного вещества, то со временем какая-нибудь частица тёмной материи с ним провзаимодействует, что можно будет зафиксировать чувствительной аппаратурой.
""", # 7
"""На данный момент исследователи по всему миру проводят эксперименты с огромными объёмами вещества в расчёте на то, что удастся что-нибудь зарегистрировать, и хотя, временами, поступают новости о положительных результатах, все они довольно спорны.
При этом тёмная материя доступна для косвенных наблюдений через явление гравитационного линзирования. На основании данных наблюдений даже была составлена карта распределения тёмной материи во Вселенной.
""", # 8
"""Благодаря тёмной материи ученые смогли объяснить и образование галактик, так как уровень схлопывания межзвездного газа явно был недостаточен для образования галактики, а другой материи пригодной для описания галактикообразования на тот момент не было известно.
Помимо этого, у тёмной материи было и любопытное следствие, так как по расчетам её масса выходила аж очень большой — до 26 % всей массы нашей Вселенной — то она должна создавать сильные гравитационные поля, которые способствуют притяжению материи друг к другу и, как следствие, замедляют расширение Вселенной.
""", # 9
"""Исходя из этого встал вопрос о том, насколько быстро замедляется расширение Вселенной. Если тёмной материи относительно мало, то Вселенная может расширяться вечно, постепенно замедляя скорость расширения, но никогда не доводя её до нуля. Некоторые учёные считали, что тёмной материи даже больше, чем мы думаем, и она рано или поздно приведёт к тому, что Вселенная, не выдержав собственную массивность, перестанет расширяться и начнёт сжиматься обратно, пока не сколлапсирует в ту самую одну-единственную точку или сингулярность — так называемая теория Большого схлопывания. Чтобы выяснить, что именно нас ждёт, учёные продолжали свои исследования.
"""
]
max_pages_book = len(book)
death_note_manga = [
"AgACAgIAAxkBAAIMmV_T-AkcpX9ge7qagiOXmDYcVcSLAAI6sjEbWkugSnw4J_xSdT3eK87KmS4AAwEAAwIAA3gAA7XdAQABHgQ",
"AgACAgIAAxkBAAIMml_T-AlEBUXkasEQezat-d10k_GNAAI7sjEbWkugSqZILwABJow2pj7BSJguAAMBAAMCAAN4AAOMRwQAAR4E",
"AgACAgIAAxkBAAIMm1_T-Alc0AYKc_WlaEFZt0yTTriiAAI8sjEbWkugSg64JSGNF5K_r-g-li4AAwEAAwIAA3gAA1imBQABHgQ",
"AgACAgIAAxkBAAIMnF_T-Akr0I8JfyvsrYVJlx6qsaF4AAI9sjEbWkugSnQPPj0q4xyaph1Lli4AAwEAAwIAA3gAA-6kBQABHgQ",
"AgACAgIAAxkBAAIMnV_T-AmIMQEZdaL6VfABxenAVgw4AAI-sjEbWkugSrRKgOMpMs7QLc9emi4AAwEAAwIAA3gAA_cWAgABHgQ",
"AgACAgIAAxkBAAIMnl_T-An0aD1h98dpbc1aET5XeCjrAAI_sjEbWkugSjgjR3oHb01Y5hfnly4AAwEAAwIAA3gAAzVKBAABHgQ",
"AgACAgIAAxkBAAIMn1_T-AntOsG6PweVsHnhvEm8qrE9AAJAsjEbWkugStkoKpZXIRNnuCGlli4AAwEAAwIAA3gAA6UnBQABHgQ",
"AgACAgIAAxkBAAIMoF_T-Akw4rkDXtqvOM2M7e3QIl1fAAJBsjEbWkugSnPE5r2CoZds5IdGli4AAwEAAwIAA3gAA7iXBQABHgQ",
"AgACAgIAAxkBAAIMoV_T-An-Zl8-uGCoJyMBV9plLmCDAAJCsjEbWkugSrJlzQABP1E3RjU5R5guAAMBAAMCAAN4AAPVSAQAAR4E",
"AgACAgIAAxkBAAIMol_T-Anf_Qq_04Gd_qipmA7eGIqZAAJDsjEbWkugStVk9CAFR1zqIqHoly4AAwEAAwIAA3gAA1RLBAABHgQ",
]
max_pages_manga = len(death_note_manga)
class Item:
def __init__(self, name, price):
self.name = name
self.price = price
self.id = randint(1000, 10_000)
items_raw = [
("glass", 249),
("twister", 672),
("purse", 342),
("rubber band", 494),
("remote", 874),
("blanket", 183),
("floor", 730),
("spring", 534),
("paint brush", 711),
("couch", 584),
("tissue box", 112),
("model car", 217),
("sponge", 73),
("fridge", 262),
("seat belt", 518),
("hair tie", 718),
("thread", 790),
("twezzers", 427),
("boom box", 309),
("piano", 96),
("bananas", 763),
("cork", 187),
("perfume", 151),
("headphones", 504),
("beef", 28),
("vase", 562),
("soda can", 263),
("key chain", 54),
("sand paper", 573),
("plate", 563),
]
items = [
Item(name=name, price=price)
for name, price in items_raw
]
def get_item(item_id):
for item in items:
if int(item_id) == item.id:
return item
def get_page(array, page: int = 1):
page_index = page - 1
return array[page_index]
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.callback_data import CallbackData
pagination_call = CallbackData("paginator", "key", "page")
show_item = CallbackData("show_item", "item_id")
def get_page_keyboard(max_pages: int, key="book", page: int = 1):
# Клавиатура будет выглядеть вот так:
# |<< | <5> | >>|
previous_page = page - 1
previous_page_text = "<< "
current_page_text = f"<{page}>"
next_page = page + 1
next_page_text = " >>"
markup = InlineKeyboardMarkup()
if previous_page > 0:
markup.insert(
InlineKeyboardButton(
text=previous_page_text,
callback_data=pagination_call.new(key=key, page=previous_page)
)
)
markup.insert(
InlineKeyboardButton(
text=current_page_text,
callback_data=pagination_call.new(key=key, page="current_page")
)
)
if next_page < max_pages:
markup.insert(
InlineKeyboardButton(
text=next_page_text,
callback_data=pagination_call.new(key=key, page=next_page)
)
)
return markup
def get_better_pages_keyboard(array, page: int = 1):
key = "items"
markup = InlineKeyboardMarkup(row_width=3)
MAX_ITEMS_PER_PAGE = 7
first_item_index = (page - 1) * MAX_ITEMS_PER_PAGE
last_item_index = page * MAX_ITEMS_PER_PAGE
sliced_array = array[first_item_index:last_item_index]
items_buttons = list()
for item in sliced_array:
items_buttons.append(
InlineKeyboardButton(
text=f'{item.name} - ${item.price}',
callback_data=show_item.new(item_id=item.id)
)
)
pages_buttons = list()
first_page = 1
first_page_text = "« 1"
if len(array) % MAX_ITEMS_PER_PAGE == 0:
max_page = len(array) // MAX_ITEMS_PER_PAGE
else:
max_page = len(array) // MAX_ITEMS_PER_PAGE + 1
max_page_text = f"» {max_page}"
pages_buttons.append(
InlineKeyboardButton(
text=first_page_text,
callback_data=pagination_call.new(key=key,
page=first_page)
)
)
previous_page = page - 1
previous_page_text = f"< {previous_page}"
if previous_page >= first_page:
pages_buttons.append(
InlineKeyboardButton(
text=previous_page_text,
callback_data=pagination_call.new(key=key,
page=previous_page)
)
)
else:
pages_buttons.append(
InlineKeyboardButton(
text=" . ",
callback_data=pagination_call.new(key=key,
page="current_page")
)
)
pages_buttons.append(
InlineKeyboardButton(
text=f"- {page} -",
callback_data=pagination_call.new(key=key,
page="current_page")
)
)
next_page = page + 1
next_page_text = f"{next_page} >"
if next_page <= max_page:
pages_buttons.append(
InlineKeyboardButton(
text=next_page_text,
callback_data=pagination_call.new(key=key,
page=next_page)))
else:
pages_buttons.append(
InlineKeyboardButton(
text=" . ",
callback_data=pagination_call.new(key=key,
page="current_page")
)
)
pages_buttons.append(
InlineKeyboardButton(
text=max_page_text,
callback_data=pagination_call.new(key=key,
page=max_page)
)
)
for button in items_buttons:
markup.insert(button)
markup.row(*pages_buttons)
return markup
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.types import CallbackQuery
from data.content import max_pages_book, book
from keyboards.inline.pagination import get_page_keyboard, pagination_call
from loader import dp
from utils.misc.pages import get_page
@dp.message_handler(Command("book"))
async def show_book(message: types.Message):
text = get_page(book)
await message.answer(text,
reply_markup=get_page_keyboard(max_pages=max_pages_book))
@dp.callback_query_handler(pagination_call.filter(page="current_page"))
async def current_page_error(call: CallbackQuery):
await call.answer(cache_time=60)
@dp.callback_query_handler(pagination_call.filter(key="book"))
async def show_chosen_page(call: CallbackQuery, callback_data: dict):
current_page = int(callback_data.get("page"))
text = get_page(book, page=current_page)
markup = get_page_keyboard(max_pages=max_pages_book, page=current_page)
await call.message.edit_text(text=text, reply_markup=markup)
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.types import CallbackQuery, InputMediaPhoto
from data.content import max_pages_manga, death_note_manga
from keyboards.inline.pagination import get_page_keyboard, pagination_call
from loader import dp
from utils.misc.pages import get_page
@dp.message_handler(Command("manga"))
async def show_manga(message: types.Message):
photo = get_page(death_note_manga)
await message.answer_photo(photo=photo,
reply_markup=get_page_keyboard(
key="manga",
max_pages=max_pages_manga)
)
@dp.callback_query_handler(pagination_call.filter(key="manga"))
async def show_chosen_page(call: CallbackQuery, callback_data: dict):
current_page = int(callback_data.get("page"))
photo_file_id = get_page(death_note_manga, page=current_page)
media = InputMediaPhoto(photo_file_id)
await call.message.edit_media(
media=media,
reply_markup=get_page_keyboard(
key="manga",
max_pages=max_pages_manga,
page=current_page
)
)
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.types import CallbackQuery
from data.content import items, get_item
from keyboards.inline.pagination import get_better_pages_keyboard, pagination_call, show_item
from loader import dp
@dp.message_handler(Command("items"))
async def show_items_handler(message: types.Message):
await message.answer(
"Вот наши товары:",
reply_markup=get_better_pages_keyboard(items)
)
@dp.callback_query_handler(pagination_call.filter(key="items"))
async def show_chosen_page(call: CallbackQuery, callback_data: dict):
await call.answer()
current_page = int(callback_data.get("page"))
markup = get_better_pages_keyboard(items, page=current_page)
await call.message.edit_reply_markup(
markup
)
@dp.callback_query_handler(show_item.filter())
async def show_item(call: CallbackQuery, callback_data: dict):
item_id = callback_data.get("item_id")
item = get_item(item_id)
await call.message.answer(
f"Вы выбрали товар №{item.id} - {item.name} "
f"по цене: {item.price}"
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment