Skip to content

Instantly share code, notes, and snippets.

@Tishka17
Tishka17 / jsonrpc.py
Last active November 15, 2022 08:28
JsonRPC Client using dataclass-rest
import logging
from dataclasses import dataclass
from typing import Any, List
from uuid import uuid4
from dataclass_factory import Factory, Schema, NameStyle
from requests import Response
from dataclass_rest import post
from dataclass_rest.exceptions import ApiException
@Tishka17
Tishka17 / test_get_chat.py
Created December 7, 2022 17:42
AI generated test for get_chat function
def test_get_chat():
# Test a Message event
message = Message(
id=1,
from_user=User(id=1, first_name="Alice"),
chat=Chat(id=1, type="private"),
date=datetime.now(),
text="Hello!",
)
assert get_chat(message) == message.chat
@Tishka17
Tishka17 / README.md
Last active July 27, 2025 20:24
Fastpi Depends Stub

This Stub class is designed as a workaround for Fastapi Depends which mixes IoC-Container features with request parsing.

You can use parametrized Stub instance to declare dependency whilst not show your class'es __init__ params in OpenAPI specification.

@Tishka17
Tishka17 / providers.md
Last active February 5, 2023 19:23
Providers logic

Consumptions:

  • ListProvider - generates static list when list is requested
  • ListExtendProvider - prepends data to a list generated by other list provider
  • ItemProvider - generates single number
  • ListItemProvider - generates list of items retrieved from other providers

1. First can access data from following

Providers:

ListExtendProvider([1, 2]), ListProvider([3, 4])
@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)
@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 / 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 / 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 / article.md
Last active December 7, 2025 03:12
dialgos article

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

Введение

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

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

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

@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