Фармонҳо бо аргументҳо
Ба бот фармонҳо лозиманд: !choose, !roll 2d6, q!help. Биёед бинем, ки онҳо дар дохил чӣ тавр сохта шудаанд.
Префикс ва таҳлил
PREFIX = "q!"
def parse(content):
if not content.startswith(PREFIX):
return None # паёми оддӣ, на фармон
command, _, rest = content[len(PREFIX):].partition(" ")
return (command.lower(), rest.strip()) if command else None
- префиксро аз рӯи дарозиаш мебуранд: он метавонад аз якчанд аломат иборат бошад;
- номи фармонро ба ҳарфҳои хурд меоранд — корбарон чӣ тавре хоҳанд, менависанд;
partition(" ")сатрро аз рӯи фосилаи аввал тақсим мекунад: номи фармон ва ҳамаи боқимонда.
Фармонҳоро дар луғати «ном → функсия» нигоҳ доштан қулай аст — фармони нав бо як сатр илова мешавад, номаълумро бошад осон пай бурдан мумкин.
Аргументҳо
Аргументҳоро санҷед ва бо маслиҳати фаҳмо ҷавоб диҳед. Барои формати мураккаб (2d6) ифодаҳои мунтазам хуб мувофиқанд:
import re
m = re.fullmatch(r"(\d+)d(\d+)", arg.lower())
if not m:
await message.channel.send("Формат: !roll 2d6")
return
count, sides = int(m.group(1)), int(m.group(2))
re.fullmatch мувофиқати тамоми сатрро талаб мекунад — аломатҳои зиёдатӣ пеш ё баъд намегузаранд.
Тасодуф
Барои бозиҳо ва партобҳо генератори худро доштан қулай аст:
import random
rng = random.Random()
rng.choice(["питса", "суши"]) # унсури тасодуфӣ
rng.randint(1, 6) # аз 1 то 6 бо дохилшавӣ
rng.seed(42) # пайдарпайии якхела — барои санҷишҳо
Фармонҳои тайёри discord.py
Дар ботҳои калон фармонҳоро дастӣ таҳлил намекунанд. Дар discord.py васеъкунии commands ҳаст:
from discord.ext import commands
bot = commands.Bot(command_prefix="q!", intents=intents)
@bot.command()
async def roll(ctx, dice: str):
await ctx.send(f"{dice}-ро мепартоям")
bot.run(token)
Вай худаш префикс ва аргументҳоро таҳлил мекунад, навъҳоро табдил медиҳад (count: int), маълумотномаи q!help-ро месозад ва дар бораи хатоҳо хабар медиҳад. Фармонҳои слэш (/roll бо маслиҳатҳо мустақиман дар Discord)-ро тавассути bot.tree.command ва discord.app_commands месозанд. Таҳлили дастиро фаҳмида, бо онҳо осон сарфаҳм рафтан мумкин.
Хулоса
startswith(PREFIX), буридан аз рӯиlen(PREFIX),partition(" "),lower();- луғати фармонҳо, ҷавоб ба фармони номаълум;
- санҷиши аргументҳо,
re.fullmatch; random.Random():choice,randint,seed;commands.Botбарои ботҳои калон.