Skip to content

Instantly share code, notes, and snippets.

@Tishka17
Tishka17 / README.md
Created April 10, 2024 12:16
Dishka rendering example 2

Usage:

regs = [container.registry]+list(container.child_registries)
x = render(regs, type(container))
print(x)
@Tishka17
Tishka17 / render.py
Created March 4, 2024 23:47
Dishka graph rendering
from collections import defaultdict
from dataclasses import dataclass
from uuid import uuid4
from dishka.dependency_source.factory import Factory
from dishka.entities.key import DependencyKey
from dishka.entities.scope import BaseScope
from dishka.registry import Registry
@Tishka17
Tishka17 / hhash.py
Last active December 14, 2023 16:29
Comparing hash calculation
import hashlib
from timeit import timeit
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
a = b'1 2 3 4' * 1024 * 1024 * 100
funcs = [
hashlib.sha1,
hashlib.sha256,
hashlib.sha384,
@Tishka17
Tishka17 / announce.html
Created September 3, 2023 12:19
Dialogs 2.0 announce HTML
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></meta></head>
<body>
<h2>Хочу объявить о выходе <b>aiogram_dialog</b> <code>2.0.0</code></h2>
<p>
Разработка заняла полтора года с января 2022, было выпущено более 20
промежуточных версий.
Изначально это планировалось как порт версии 1.х на aiogram3, но после
@Tishka17
Tishka17 / dialog_start_result.py
Created September 2, 2023 18:57
Custom Start widget with result processing
import asyncio
import logging
import os
from typing import Any
from typing import (
Optional,
)
from aiogram import Bot, Dispatcher, F, Router
from aiogram.filters import CommandStart
@Tishka17
Tishka17 / article.md
Last active September 1, 2023 06:47
dialgos article

Создание telegram-ботов с интерактивным меню

Введение

Однажды меня попросили провести ревью и рефакторинг одного telegram-бота. Увидев файл размером 2000 строк, рассчитанный только на обработку разных меню я понял, что это требует унификации и общих подходов. Так родилась библиотека aiogram-dialog.

В этой статье я бы хотел обратить внимание на некоторые проблемы, которые мы встречаем при создании таких меню, предложить варианты их решения. А во второй половине статьи показать как это решается с помощью aiogram-dialog.

Мы не будем рассматривать архитектуру всего приложения, об этом вы можете прочитать у Фаулера или Мартина. Мы поговорим только про определенную часть UI ботов. Так же это не будет введением в разработку telegram-ботов с нуля. Я предполагаю, что читатель знаком с питоном, ООП и слышал о такой вещи как DRY. В коде примеров я использую aiogram v3.0 и надеюсь, что читатель уже встроенную в библиотеку использовал машину состояний.

@Tishka17
Tishka17 / babel_calendar.py
Created June 17, 2023 17:06
Example of localized aiogram_dialog calendar usign babel
from datetime import date
from datetime import date
from typing import Dict
from babel.dates import get_month_names, get_day_names
from aiogram_dialog import DialogManager
from aiogram_dialog.widgets.kbd import Calendar, CalendarScope
from aiogram_dialog.widgets.kbd.calendar_kbd import (
CalendarDaysView, CalendarMonthView, CalendarScopeView, CalendarYearsView,
@Tishka17
Tishka17 / managed.py
Last active May 4, 2023 20:33
Managed widgets demo for aiogram-dialog
from typing import Protocol, TypeVar, Type, Dict, Any
ManagedW = TypeVar("ManagedW", covariant=True)
class Manageable(Protocol[ManagedW]):
def manage(self) -> ManagedW:
raise NotImplementedError
@Tishka17
Tishka17 / event.json
Created February 21, 2023 12:53
Example of REST API models with filtering
{
"body": "{\"sort\": {\"sortBy\": \"id\"}, \"filters\": {\"samples\": {\"concentration\": {\"min_value\": 1.2}, \"competitor\": \"abc\"}, \"hit_strength\": {\"min_value\": 20.0, \"max_value\": 50.0}}}",
"headers": {
"Accept": "*/*",
"Content-Length": "26",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "127.0.0.1:3000",
"User-Agent": "curl/7.68.0",
"X-Forwarded-Port": "3000",
"X-Forwarded-Proto": "http"
@Tishka17
Tishka17 / count_descendants.py
Last active February 15, 2023 16:06
Count descendants
class Cls:
def __init__(self, name, parents):
self.name = name
self.parents = parents
self.children = []
self.descendents = set()
def attach_parents(self, tree):
for parent in self.parents:
tree[parent].children.append(self)