Skip to content

Commit 3a06d57

Browse files
committed
Fix pyright & Add pyright lint & Reformat all files
1 parent 3162bf0 commit 3a06d57

File tree

15 files changed

+165
-104
lines changed

15 files changed

+165
-104
lines changed

Dockerfile.lint

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ FROM pypy:3
22

33
WORKDIR /usr/src/app
44

5-
RUN pip install ruff
5+
RUN pip install ruff pyright
66
COPY requirements.txt .
77
RUN pip install -r requirements.txt --no-cache-dir
88
COPY . .
99

10-
CMD ["ruff", "check", "--extend-select", "I"]
10+
CMD ruff check --extend-select I && pyright

src/entities/__init__.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@
44
from .logs import logger
55
from .utils import get_keyboard, get_update_user_info, log_error
66

7-
__all__ = ["TOKEN", "POSTGRES_USER", "POSTGRES_PASSWORD", "ADMINS", "TEXT",
8-
"States", "get_update_user_info", "storage", "bot",
9-
"log_error", "get_keyboard", "logger"]
7+
__all__ = [
8+
"TOKEN",
9+
"POSTGRES_USER",
10+
"POSTGRES_PASSWORD",
11+
"ADMINS",
12+
"TEXT",
13+
"States",
14+
"get_update_user_info",
15+
"storage",
16+
"bot",
17+
"log_error",
18+
"get_keyboard",
19+
"logger",
20+
]

src/entities/constants.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from os import getenv
2+
from typing import cast
3+
4+
TOKEN = cast(str, getenv("TOKEN"))
5+
assert TOKEN
26

3-
TOKEN = getenv("TOKEN")
47
POSTGRES_USER = getenv("POSTGRES_USER")
58
POSTGRES_PASSWORD = getenv("POSTGRES_PASSWORD")
6-
ADMINS = list(map(int, getenv("ADMINS").split(',')))
9+
ADMINS = list(map(int, (getenv("ADMINS") or "").split(",")))
710
BOT_NAME = getenv("BOT_NAME")
811

912
TEXT = {
@@ -44,7 +47,7 @@
4447
сколько угодно сертификатов",
4548
"user-count": "У вас осталось сертификатов: {%COUNT%}",
4649
"cancel": "❌ Отмена",
47-
"create-link-cancelled": '👌 Создание ссылки отменено',
50+
"create-link-cancelled": "👌 Создание ссылки отменено",
4851
"create-cert-cancelled": "👌 Создание сертификата отменено",
49-
"check-cert-cancelled": "👌 Проверка сертификата отменена"
52+
"check-cert-cancelled": "👌 Проверка сертификата отменена",
5053
}

src/entities/logs.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
debug_file = logging.FileHandler("logs/debug.log")
88
error_file = logging.FileHandler("logs/error.log")
99

10+
1011
console_handler.setLevel(logging.DEBUG)
1112
debug_file.setLevel(logging.DEBUG)
1213
error_file.setLevel(logging.ERROR)
1314

14-
detailed_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - \
15-
[%(pathname)s:%(lineno)d] - %(message)s')
15+
detailed_format = logging.Formatter(
16+
"%(asctime)s - %(name)s - %(levelname)s - \
17+
[%(pathname)s:%(lineno)d] - %(message)s"
18+
)
1619

1720
console_handler.setFormatter(detailed_format)
1821
debug_file.setFormatter(detailed_format)

src/entities/utils.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from aiogram.types import ReplyKeyboardMarkup, Update
1+
from aiogram.types import Message, ReplyKeyboardMarkup
2+
from aiogram.types.base import TelegramObject
3+
from aiogram.types.callback_query import CallbackQuery
4+
from aiogram.types.pre_checkout_query import PreCheckoutQuery
25
from aiogram.utils.keyboard import ReplyKeyboardBuilder
36

47
from entities import ADMINS, TEXT
@@ -10,17 +13,17 @@
1013

1114
def admin_markup() -> ReplyKeyboardMarkup:
1215
builder = ReplyKeyboardBuilder()
13-
builder.button(text=TEXT['create-link'])
14-
builder.button(text=TEXT['create-cert'])
15-
builder.button(text=TEXT['check-cert'])
16+
builder.button(text=TEXT["create-link"])
17+
builder.button(text=TEXT["create-cert"])
18+
builder.button(text=TEXT["check-cert"])
1619
builder.adjust(1)
1720
return builder.as_markup(resize_keyboard=True)
1821

1922

2023
def user_markup() -> ReplyKeyboardMarkup:
2124
builder = ReplyKeyboardBuilder()
22-
builder.button(text=TEXT['create-cert'])
23-
builder.button(text=TEXT['check-count'])
25+
builder.button(text=TEXT["create-cert"])
26+
builder.button(text=TEXT["check-count"])
2427
builder.adjust(1)
2528
return builder.as_markup(resize_keyboard=True)
2629

@@ -31,18 +34,17 @@ def get_keyboard(user: User):
3134
return user_markup()
3235

3336

34-
def get_update_user_info(update: Update):
37+
def get_update_user_info(update: TelegramObject):
3538
chat_id = 0
3639
username = ""
37-
if update.event_type == "message":
38-
chat_id = update.message.chat.id
39-
username = update.message.from_user.username
40-
elif update.event_type == "callback_query":
41-
chat_id = update.callback_query.from_user.id
42-
username = update.callback_query.from_user.username
43-
elif update.event_type == "pre_checkout_query":
44-
chat_id = update.pre_checkout_query.from_user.id
45-
username = update.pre_checkout_query.from_user.username
40+
if (
41+
isinstance(update, Message) or isinstance(update, PreCheckoutQuery)
42+
) and update.from_user:
43+
chat_id = update.from_user.id
44+
username = update.from_user.username
45+
elif isinstance(update, CallbackQuery):
46+
chat_id = update.from_user.id
47+
username = update.from_user.username
4648

4749
if username is None:
4850
username = f"unknown:${chat_id}"
@@ -53,5 +55,4 @@ def get_update_user_info(update: Update):
5355
async def log_error(message: str):
5456
logger.error(message)
5557
for admin_chat_id in ADMINS:
56-
await bot.send_message(chat_id=admin_chat_id,
57-
text=message)
58+
await bot.send_message(chat_id=admin_chat_id, text=message)

src/models/cert.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
def cert_code():
9-
return ''.join([str(randint(1, 9)) for _ in range(8)])
9+
return "".join([str(randint(1, 9)) for _ in range(8)])
1010

1111

1212
class Cert(BaseModel):

src/models/db.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
from entities import POSTGRES_PASSWORD, POSTGRES_USER
44

5-
db = peewee_async.PsycopgDatabase('usmile',
6-
user=POSTGRES_USER,
7-
password=POSTGRES_PASSWORD,
8-
host="postgres",
9-
port=5432)
5+
db = peewee_async.PsycopgDatabase(
6+
"usmile",
7+
user=POSTGRES_USER,
8+
password=POSTGRES_PASSWORD,
9+
host="postgres",
10+
port=5432,
11+
)
1012

1113

1214
class BaseModel(peewee_async.AioModel):

src/models/user.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ class User(BaseModel):
88
username = TextField()
99
count = IntegerField(default=0)
1010

11+
def info(self):
12+
return f"{self.username}:{self.chat_id}"
13+
1114

1215
def init_user():
1316
db.create_tables([User])

src/routers/check_cert.py

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from typing import cast
2+
13
from aiogram import F, Router
24
from aiogram.filters import Command, StateFilter
35
from aiogram.fsm.context import FSMContext
46
from aiogram.types import CallbackQuery, Message, ReplyKeyboardRemove
7+
from aiogram.types.inaccessible_message import InaccessibleMessage
58
from aiogram.utils.keyboard import InlineKeyboardBuilder
9+
from playhouse.cockroachdb import BooleanField
610

711
from entities import ADMINS, TEXT, States, get_keyboard
812
from models import Cert, User
@@ -11,39 +15,43 @@
1115

1216

1317
@router.message(StateFilter(None), Command("check"), F.chat.id.in_(ADMINS))
14-
@router.message(StateFilter(None), F.text == TEXT['check-cert'],
15-
F.chat.id.in_(ADMINS))
18+
@router.message(
19+
StateFilter(None), F.text == TEXT["check-cert"], F.chat.id.in_(ADMINS)
20+
)
1621
async def check_start(message: Message, state: FSMContext):
1722
await state.set_state(States.TypingCert)
18-
await message.answer(TEXT['input-cert'],
19-
reply_markup=ReplyKeyboardRemove())
23+
await message.answer(TEXT["input-cert"], reply_markup=ReplyKeyboardRemove())
2024

2125

2226
@router.message(StateFilter(States.TypingCert), Command("cancel"))
2327
async def cancel(message: Message, state: FSMContext, user: User):
2428
await state.set_state(None)
25-
await message.answer(TEXT['check-cert-cancelled'],
26-
reply_markup=get_keyboard(user))
29+
await message.answer(
30+
TEXT["check-cert-cancelled"], reply_markup=get_keyboard(user)
31+
)
2732

2833

2934
@router.message(StateFilter(States.TypingCert), F.chat.id.in_(ADMINS))
3035
async def check_cert(message: Message, state: FSMContext, user: User):
36+
if not message.text:
37+
raise Exception(f"Message without text {user.info()}")
38+
3139
await state.set_state(None)
3240

3341
markup = get_keyboard(user)
3442
query = Cert.select().where(Cert.code == message.text.strip())
3543

36-
if not await query.aio_exists():
37-
await message.answer(TEXT['no-cert'], reply_markup=markup)
44+
if not await query.aio_exists(): # type: ignore
45+
await message.answer(TEXT["no-cert"], reply_markup=markup)
3846
return
3947

40-
cert = await query.aio_first()
48+
cert = await query.aio_first() # type: ignore
4149

4250
if cert.used:
43-
await message.answer(TEXT['used-cert'], reply_markup=markup)
51+
await message.answer(TEXT["used-cert"], reply_markup=markup)
4452
return
4553

46-
text = TEXT['ok-cert']
54+
text = TEXT["ok-cert"]
4755
text = text.replace("{%NAME%}", cert.name)
4856

4957
await message.answer(text, reply_markup=markup)
@@ -53,26 +61,35 @@ async def check_cert(message: Message, state: FSMContext, user: User):
5361
builder.button(text="Нет", callback_data="unused")
5462
builder.adjust(2)
5563

56-
await message.answer(TEXT['input-used'], reply_markup=builder.as_markup())
64+
await message.answer(TEXT["input-used"], reply_markup=builder.as_markup())
5765

5866

59-
@router.callback_query(F.data.regexp("used\\|\\d+"),
60-
F.from_user.id.in_(ADMINS))
61-
async def cert_used(query: CallbackQuery):
67+
@router.callback_query(F.data.regexp("used\\|\\d+"), F.from_user.id.in_(ADMINS))
68+
async def cert_used(query: CallbackQuery, user: User):
6269
await query.answer()
70+
71+
if not query.message or isinstance(query.message, InaccessibleMessage):
72+
raise Exception(f"Query without corresponding message {user.info()}")
73+
if not query.data:
74+
raise Exception(f"Query without data {user.info()}")
75+
6376
await query.message.edit_reply_markup(reply_markup=None)
6477

6578
_, code = query.data.split("|")
6679
cert: Cert = await Cert.aio_get(Cert.code == code)
67-
cert.used = True
80+
cert.used = cast(BooleanField, True)
6881
await cert.aio_save()
6982

70-
await query.message.edit_text(TEXT['ok-used'])
83+
await query.message.edit_text(TEXT["ok-used"])
7184

7285

7386
@router.callback_query(F.data == "unused", F.from_user.id.in_(ADMINS))
74-
async def cert_unused(query: CallbackQuery):
87+
async def cert_unused(query: CallbackQuery, user: User):
7588
await query.answer()
89+
90+
if not query.message or isinstance(query.message, InaccessibleMessage):
91+
raise Exception(f"Query without corresponding message {user.info()}")
92+
7693
await query.message.edit_reply_markup(reply_markup=None)
7794

78-
await query.message.edit_text(TEXT['ok-unused'])
95+
await query.message.edit_text(TEXT["ok-unused"])

src/routers/check_count.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99

1010

1111
@router.message(StateFilter(None), Command("check_count"))
12-
@router.message(StateFilter(None), F.text == TEXT['check-count'])
12+
@router.message(StateFilter(None), F.text == TEXT["check-count"])
1313
async def check_count(message: Message, user: User):
1414
if user.chat_id in ADMINS:
15-
await message.answer(TEXT['admin-count'])
15+
await message.answer(TEXT["admin-count"])
1616
return
17-
text = TEXT['user-count']
17+
text = TEXT["user-count"]
1818
text = text.replace("{%COUNT%}", str(user.count))
1919

2020
await message.answer(text)

0 commit comments

Comments
 (0)