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

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

Ба бот фармонҳо лозиманд: !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 барои ботҳои калон.