Гузариш ба мундариҷа
Мавзӯи 3 аз 6

Фармонҳо бо аргументҳо

Чаро ба фармонҳо аргумент лозим аст

Фармон амалро интихоб мекунад, аргументҳо бошад муайян мекунанд, ки амал ба чӣ татбиқ шавад: китоб ёфтан, нишона гузоштан ё давомнокиро муайян кардан. Бе аргумент барои ҳар қимат фармони алоҳида лозим мешуд. Вале матнро инсон менависад: ӯ метавонад ададро фаромӯш кунад, фосила илова кунад ё ба ҷойи адад калима фиристад. Боти хуб мефаҳмонад, ки чиро ислоҳ кардан лозим аст ва корашро идома медиҳад.

1. CommandObject чӣ медиҳад

Филтри Command номи фармонро месанҷад ва натиҷаи ҷудокуниро ба маълумоти коркардкунанда медиҳад. Параметр бояд command ном дошта бошад; аннотатсияи CommandObject навъи онро шарҳ медиҳад. Танҳо аннотатсия бе филтр паёми дилхоҳро ҷудо намекунад.

command.args — як сатри пас аз фармон ё None аст. Ин ҳанӯз рӯйхати калимаҳо нест. Филтри воқеии aiogram-ро бе фиристодани паём мебинем. repr сарҳади сатрро нишон медиҳад; None фармони бе аргумент ва False номувофиқ будани фармонро ифода мекунад.

import asyncio
from aiogram import Bot
from aiogram.filters import Command
from aiogram.types import Chat, Message

async def main():
    bot = Bot("1:TEST")
    try:
        for text in ["/tag 8 alpha beta", "/tag", "/tagged"]:
            message = Message(message_id=1, date=0,
                              chat=Chat(id=42, type="private"), text=text)
            result = await Command("tag")(message, bot)
            print(repr(result["command"].args) if result else False)
    finally:
        await bot.session.close()

asyncio.run(main())

Натиҷа:

'8 alpha beta'
None
False

2. Чӣ тавр боқимондаи матнро нигоҳ дорем

partition(" ") аз рӯи ҷудокунандаи аввали муайяншуда ҷудо карда, ҳамеша се қисм медиҳад: оғоз, худи ҷудокунанда ва боқимонда. Агар ҷудокунанда набошад, ду қисми охир холӣ мешаванд. split() бе аргумент аз рӯи силсилаи фосилаҳо ҷудо мекунад; maxsplit=1 шумораи ҷудокуниро маҳдуд мекунад.

args = "8 alpha beta"
first, separator, text = args.partition(" ")
print(first, repr(separator), text)
print("  8   alpha beta  ".split(maxsplit=1))
print((None or "").split())

Натиҷа:

8 ' ' alpha beta
['8', 'alpha beta  ']
[]

Боқимондаи alpha beta пурра нигоҳ дошта шуд. Дар split(maxsplit=1) фосилаҳои охир дар боқимонда мемонанд: агар муҳим набошанд, strip() лозим аст. Тарзи ҷудокуниро аз рӯи формат интихоб кунед: барои шумораи собити қиматҳои алоҳида split() қулай аст, барои «як қимат ва матни озод» боқимондаро нигоҳ доштан муфид аст.

3. Табдил ва санҷиш

int сатрро ба адади бутун, аз ҷумла адади аломатдор, табдил медиҳад. Агар табдил номумкин бошад, ValueError ба вуҷуд меояд. Сохтори try/except имкон медиҳад, ки ба ҷойи қатъшавӣ ҷавоби фаҳмо интихоб шавад. Дар мисол None шартан хатост; боти воқеӣ роҳнамои формати фармонро мефиристад.

for raw in ["-4", "6.5", ""]:
    try:
        value = int(raw)
    except ValueError:
        print(None)
        continue
    print(value, value * 2)

Натиҷа:

-4 -8
None
None

"-4" барои int дуруст аст, вале "6.5" навишти адади бутун нест. isdigit() минусро қабул намекунад ва санҷиши ҳудудро иваз намекунад. Ҳангоми табдили вуруди корбар ValueError-ро коркард кунед.

Пас аз табдил маҳдудиятҳо ва мавҷудияти матнро алоҳида санҷед. Агар роҳнамои хато фиристодед, коркардкунандаро бо return анҷом диҳед: вагарна коди поён метавонад ҷавоби дуюм фиристад ё тағйирёбандаҳои нотайёрро истифода кунад.

4. Дастрасӣ аз рӯи корбар

Номҳо метавонанд яксон бошанд ва иваз шаванд. ID-и корбар — рақамест, ки бот бо он фиристандагонро фарқ мекунад. Барои ID-ҳои иҷозашуда маҷмӯи set қулай аст: узвият бо филтри F.from_user.id.in_(...) ифода мешавад.

from aiogram import F
from aiogram.types import Chat, Message, User

allowed = F.from_user.id.in_({11, 22})
for uid in [11, 33]:
    message = Message(message_id=1, date=0,
                      chat=Chat(id=42, type="private"),
                      from_user=User(id=uid, is_bot=False, first_name="Mina"),
                      text="/report")
    print(uid, allowed.resolve(message))

Натиҷа:

11 True
33 False

Номи ҳар ду паём яксон аст, вале танҳо ID-и дохили маҷмӯъ дастрасӣ мегирад. Ин қоида коркардкунандаро интихоб мекунад; барои дигарон радди фаҳмо дар коркардкунандаи дигар лозим аст. Ҳамаи филтрҳои бо вергул ҷудошуда бояд иҷро шаванд: масалан, фармони report ва фиристандаи иҷозашуда. Қоидаи махсустарро пеш аз қоидаи умумии ҳамон фармон сабт мекунанд.

Дар дохил чӣ мегузарад

Коркардро мисли қабули фармоиш тасаввур кунед. Аввал навъи фармоиш муайян мешавад — филтри Command. Баъд ҷузъиёт хонда мешавад — args. Сипас кофӣ ва дуруст будани маълумот санҷида мешавад. Танҳо пас аз ҳамаи санҷишҳо амал иҷро мегардад. Агар маълумотро пеш аз санҷиш иваз кунед, фармони нодуруст метавонад амали ниматамом гузорад.

Хатоҳои маъмул ва ислоҳ

  1. Фаромӯш кардани фармони холӣ. command.args.split() ҳангоми None хатои AttributeError медиҳад. Аввал (command.args or "").split() истифода карда, баъд натиҷаро санҷед.
  2. Табдил бе коркарди хато. int("abc") хатои ValueError медиҳад ва корбар ҷавоби одӣ намегирад. Хаторо гирифта, мисоли вуруди дурустро фиристед.
  3. Гум кардани матн. parts[1] пас аз split()-и пурра танҳо як калимаро мегирад. Барои боқимондаи чандкалимагӣ ҷудокунии маҳдуд ё partition истифода кунед.
  4. Идома пас аз рад. Пас аз await message.answer(...) иҷро қатъ намешавад. Ба шохаи вуруди нодуруст return илова кунед.
  5. Санҷиши дастрасӣ аз рӯи ном. first_name == "Mina" ба ҳар ҳамном дастрасӣ медиҳад. ID истифода карда, коркардкунандаи дорои филтри иловагиро пеш аз умумӣ гузоред.

Ёддошт

Усул Кай истифода мешавад
command: CommandObject Гирифтани натиҷаи филтри Command
command.args or "" Кори бехатар бо аргументҳои мавҷуднабуда
split() Ҷудокунии қиматҳои алоҳида
partition(" "), split(maxsplit=1) Нигоҳ доштани боқимондаи матн
try/except ValueError Санҷиши табдили адад
strip() Тозакунии фосилаҳои канор
return Анҷоми коркард пас аз роҳнамоӣ
F.from_user.id.in_(...) Маҳдуд кардани коркардкунанда ба маҷмӯи корбарон