ازگر کا استعمال کرتے ہوئے ایک بنیادی ڈسکارڈ کہانی سنانے، چیٹ، اور دماغی صحت کا بوٹ کیسے بنایا جائے

جب آپ ڈسکارڈ بوٹس کو عمل میں دیکھتے ہیں، تو وہ حیرت انگیز طور پر پیچیدہ لگ سکتے ہیں۔ بوٹس پیغامات کا جواب دے سکتے ہیں، کہانیاں سنا سکتے ہیں، گفتگو کے کچھ حصے یاد رکھ سکتے ہیں، اور دن میں 24 گھنٹے آن لائن رہ سکتے ہیں۔

جب میں نے پہلی بار یہ دیکھنا شروع کیا کہ یہ کیسے کام کرتا ہے، میں نے سوچا کہ اس کے پیچھے ایک ٹن پیچیدہ کوڈ ہوگا۔

لیکن بنیادی خیال دراصل بہت آسان ہے۔

بنیادی طور پر، ایک Discord bot ایک Python پروگرام ہے جو Discord سے جڑتا ہے، کچھ ہونے کا انتظار کرتا ہے، اور پھر فیصلہ کرتا ہے کہ جواب کیسے دیا جائے۔ ایک بار جب آپ بنیادی خیال کو سمجھ لیں، تو آپ ایک وقت میں ایک ایک خصوصیات شامل کرنا شروع کر سکتے ہیں اور اپنے سادہ بوٹ کو زیادہ دلچسپ چیز میں تبدیل کر سکتے ہیں۔

اس ٹیوٹوریل میں، ہم ایک بہت ہی چھوٹے بوٹ سے شروع کریں گے اور آہستہ آہستہ اسے مزید قابل بوٹ تک بنائیں گے۔ راستے میں، آپ Discord کمانڈز، ایونٹس، غیر مطابقت پذیر ازگر، صارف کی حالت، ماحولیاتی متغیرات، اور بنیادی تعیناتیوں کے بارے میں سیکھیں گے۔

شروع کرنے سے پہلے ایک فوری تردید: اس پروجیکٹ کے لیے، دماغی صحت کی جو خصوصیات ہم اس بوٹ میں شامل کریں گے وہ ہیں: علاج نہیںبوٹس تھراپسٹ یا طبی پیشہ ور نہیں ہیں۔ آپ کو صرف عام امدادی پیشکشیں پیش کرنی چاہئیں اور جب مناسب ہو تو صارفین کو قابل اعتماد لوگوں سے رابطہ کرنے کی ترغیب دینی چاہیے۔

آئیے اس مسئلے کو حل کریں اور کوڈنگ شروع کریں!

ہم کیا احاطہ کریں گے:

ہم کیا بنا رہے ہیں

تیار شدہ بوٹ میں کئی کمانڈز ہیں:

!hello
!story
!chat hello!
!support I'm having a stressful day
!help

مثال کے طور پر:

User:
!story

Bot:
You wake up inside an abandoned library.

There are three doors in front of you:

1. A red wooden door
2. A metal door covered in strange symbols
3. A staircase leading underground

Which one do you choose?

اس کے بعد صارف کہانی جاری رکھ سکتا ہے۔

چیٹ کے لیے:

User:
!chat What's a good way to learn Python?

Bot:
Try building small projects instead of only reading tutorials.
A Discord bot is actually a pretty fun project to start with.

دماغی صحت کی معاونت:

User:
!support I'm really stressed about school.

Bot:
That sounds like a lot to deal with. You could try breaking
the work into one small task at a time and taking a short
break between tasks.

I'm a bot, not a therapist, so if you need personal support,
consider talking with someone you trust.

مقصد جادوئی روبوٹ تھراپسٹ بنانا نہیں ہے۔ آپ سیکھیں گے کہ Discord API، Python فنکشنز، ایونٹس، غیر مطابقت پذیر پروگرامنگ، اور بنیادی گفتگو کی منطق ایک مفید بوٹ بنانے کے لیے کس طرح ایک ساتھ فٹ بیٹھتی ہے۔

آپ کو کیا ضرورت ہے

آپ کو صرف چند چیزوں کی ضرورت ہے:

  • Python (ورژن 3.8 یا اس سے زیادہ تجویز کردہ)

  • ڈسکارڈ اکاؤنٹ

  • بوٹس شامل کرنے کی اجازت کے ساتھ ڈسکارڈ سرور

  • کوڈ ایڈیٹر (میں ذاتی طور پر VS کوڈ یا PyCharm کو ترجیح دیتا ہوں)

  • کہ discord.py لائبریری

ہم Python کے بلٹ ان فنکشنز بھی استعمال کریں گے۔ os یہ ایک ماڈیول ہے جو ماحولیاتی متغیرات کو پڑھتا ہے۔

اگر آپ کے پاس پہلے سے ہی Python انسٹال نہیں ہے تو، Python کی آفیشل ویب سائٹ سے Python کا فی الحال تعاون یافتہ ورژن انسٹال کریں۔

پھر چیک کریں کہ آیا Python کام کر رہا ہے۔

python --version

آپ کو مندرجہ ذیل کی طرح کچھ دیکھنا چاہئے:

Python 3.x.x

ڈسکارڈ بوٹ بنائیں

اس سے پہلے کہ ازگر Discord کو کنٹرول کر سکے، آپ کو Discord ایپلی کیشن بنانے کی ضرورت ہے۔

Discord ڈویلپر پورٹل پر جائیں: https://discord.com/developers/applications

یہ صفحہ کیسا لگتا ہے: شروع کرنے سے پہلے آپ کو اپنے Discord ای میل/صارف نام اور پاس ورڈ کے ساتھ لاگ ان کرنے کی ضرورت پڑسکتی ہے۔

اوپری دائیں کونے میں "نئی ایپلیکیشن” بٹن پر کلک کریں اور اپنے بوٹ کو ایک نام دیں۔ اس ٹیوٹوریل میں ہمارا نام ہے۔ StoryBot.

جب آپ نے اسے کلک کیا تو یہ کیسا لگتا تھا اس کی تصویر

درخواست بنیادی طور پر بوٹ کا گھر ہے۔

Discord کا ڈویلپر پلیٹ فارم وہ ٹولز فراہم کرتا ہے جن کی آپ کو ایپلی کیشنز اور بوٹس بنانے اور کنفیگر کرنے کی ضرورت ہے۔

ایپلیکیشن بنانے کے بعد اسے کھولیں۔ بوٹ سیکشن پر کلک کریں اور بوٹ صارف بنائیں۔ اگر آپ چاہیں تو آپ اپنی اپنی تصویریں اور بینرز شامل کر سکتے ہیں۔

پھر جائیں: ٹوکن سیکشن پر کلک کریں اور ٹوکن بنانے کے لیے "ری سیٹ ٹوکن” پر کلک کریں۔ اس ٹوکن کو پاس ورڈ کی طرح سمجھیں۔ کرو نہیں اسے براہ راست اپنے Python سورس کوڈ میں ڈالیں۔

بوٹس سیکشن کا ٹوکن حصہ کیسا لگتا ہے اس کی تصویر

ایسا کبھی نہ کریں:

bot.run("my-secret-token")

اور GitHub پر ٹوکنز اپ لوڈ نہ کریں اور نہ ہی انہیں سورس کنٹرول کرنے کا پابند کریں۔ اس کے بجائے، ہم اسے ماحولیاتی متغیر میں ذخیرہ کریں گے، جس کی وضاحت ہم بعد میں کریں گے۔

بوٹ کو پیغامات پڑھنے کی اجازت دیں۔

ہمارے بوٹ کو ایسے پیغامات کی جانچ پڑتال کرنے کی ضرورت ہے جن میں کمانڈز ہوں۔

ڈسکارڈ کچھ اس طرح استعمال کرتا ہے: گیٹ وے کا ارادہ آپ کے بوٹ کو موصول ہونے والے واقعات کی اقسام کو کنٹرول کرتا ہے۔ کہ discord.py دستاویزات میں وضاحت کی گئی ہے کہ اجازت شدہ ارادوں کے لیے کوڈ اور ڈسکارڈ ڈویلپر پورٹل دونوں میں ارادوں کا فعال ہونا ضروری ہے۔

ڈویلپر پورٹل میں، تلاش کریں:

Bot
→ Privileged Gateway Intents

فعال کریں:

Message Content Intent

یہ اس طرح نظر آئے گا:

میں کیا کروں؟

ہم اسے ازگر میں بھی فعال کریں گے، جس پر ہم بعد میں اس مضمون میں بات کریں گے۔

ایک پروجیکٹ بنائیں

ایک فولڈر بنائیں:

discord-story-bot/

اس میں بالآخر شامل ہیں:

discord-story-bot/
│
├── bot.py
├── requirements.txt
└── .env

تین اہم فائلیں ہیں:

  • bot.py: ہمارا Python پروگرام

  • requirements.txt: ٹیکسٹ فائل جس میں بوٹ کے لیے مطلوبہ پیکیج کے نام شامل ہیں۔

  • .env: مقامی ترقی کے دوران خفیہ ٹوکن

ایک ورچوئل ماحول بنائیں

اپنے پروجیکٹ فولڈر میں ٹرمینل کھولیں۔

چلائیں:

python -m venv venv

پھر اسے چالو کریں۔

ونڈوز کے لیے:

venvScriptsactivate

macOS/Linux کے لیے:

source venv/bin/activate

ورچوئل ماحول اس پروجیکٹ کو اپنا چھوٹا Python بلبلا دیتا ہے۔

اس کا مطلب ہے کہ اس بوٹ کے لیے انسٹال کردہ پیکجز دوسرے پروجیکٹس کے استعمال کردہ پیکجوں میں تصادفی طور پر مداخلت نہیں کریں گے۔

discord.py انسٹال کریں۔

اب Discord لائبریری انسٹال کریں:

pip install -U discord.py

سرکاری discord.py دستاویزات لائبریری کے قیام کے لیے تنصیب کے اس طریقہ کو استعمال کرتی ہیں۔

ہم اسے بھی انسٹال کریں گے۔ python-dotenvاس سے ہم مقامی کتابیں پڑھتے ہیں۔ .env اپنی فائلوں کو آسان بنائیں:

pip install python-dotenv

پھر انحصار کو بچائیں۔

pip freeze > requirements.txt

آپ کا requirements.txt اپنے پروجیکٹ کے لیے درکار پیکجز ضرور شامل کریں۔

اپنا پہلا بوٹ بنائیں

چلو چھوٹی شروعات کرتے ہیں۔

کھلا bot.py:

import os

import discord
from discord.ext import commands
from dotenv import load_dotenv


load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(
    command_prefix="!",
    intents=intents
)


@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")


@bot.command()
async def hello(ctx):
    await ctx.send("Hello! I'm online.")


bot.run(TOKEN)

یہ پہلے سے ہی ایک فنکشنل ڈسکارڈ بوٹ ہے۔

آئیے اسے ٹکڑے ٹکڑے کر دیں۔

لائبریری درآمد کریں۔

پہلا:

import os

os Python کو آپریٹنگ سسٹم کے حصوں کے ساتھ بات چیت کرنے کی اجازت دیتا ہے۔

ماحولیاتی متغیرات کو پڑھنے کے لیے اس کا استعمال کریں۔

اگلا:

import discord

یہ آمدنی ہے۔ discord.py.

پھر:

from discord.ext import commands

کہ commands ایکسٹینشنز کمانڈز کو بہت آسان بنا سکتی ہیں۔

ہر پیغام کو دستی طور پر چیک کرنے کے بجائے اس طرح کی کسی چیز کے لیے: !helloآپ اسے اس طرح لکھ سکتے ہیں:

@bot.command()
async def hello(ctx):
    await ctx.send("Hello!")

کہ discord.py کمانڈ سسٹم Python فنکشنز پر بنایا گیا ہے جو کمانڈز سے مزین ہے۔

آخر میں:

from dotenv import load_dotenv

اس کے ذریعے ہم .env فائل

ٹوکن لوڈ

اپنے Python پروگرام کو Discord سے مربوط کرنے کے لیے، آپ کے بوٹ کو ایک ٹوکن کی ضرورت ہوگی۔ ٹوکن کو ایک پاس ورڈ کے طور پر سوچیں جو آپ کے پروگرام کو بوٹ کے ساتھ تصدیق کرنے کی اجازت دیتا ہے۔

ہم اس راز کو براہ راست اپنے Python کوڈ میں داخل نہیں کرنا چاہتے۔ آئیے اسے ماحول کے متغیر میں ذخیرہ کریں۔

براہ کرم پہلے انسٹال کریں۔ python-dotenv:

pip install python-dotenv

یہ پیکج Python کی اقدار کو پڑھنے کی اجازت دیتا ہے یہاں سے: .env فائل

اب اس طرح ایک نئی فائل بنائیں: .env اسی فولڈر میں جیسے bot.py.

اندر .envشامل کریں:

DISCORD_TOKEN=YOUR_BOT_TOKEN_HERE

تبدیلی YOUR_BOT_TOKEN_HERE Discord ڈویلپر پورٹل سے کاپی کردہ ٹوکن استعمال کریں۔

فائل کو اس طرح نظر آنا چاہئے:

DISCORD_TOKEN=your_actual_token_here

اس ٹوکن کو کسی کے ساتھ شیئر یا اپ لوڈ نہ کریں۔ .env اپنی فائلیں GitHub پر اپ لوڈ کریں۔ بوٹ ٹوکن کو پاس ورڈ کی طرح سمجھا جانا چاہئے۔

Git کو حادثاتی طور پر روکنے کے لیے: .env فائل کو اپنے ذخیرہ میں محفوظ کریں اور اس طرح کی فائل بنائیں: .gitignore اپنے پروجیکٹ فولڈر میں درج ذیل کو شامل کریں:

.env
venv/
__pycache__/

اب ٹوکن کو Python میں لوڈ کرتے ہیں۔

سب سے اوپر bot.pyشامل کریں:

import os
from dotenv import load_dotenv

پھر شامل کریں:

load_dotenv()

یہ ازگر کو تلاش کرنے کو کہتا ہے: .env ایک فائل بنائیں اور اس میں متغیرات لوڈ کریں۔

اب آپ Discord ٹوکن حاصل کر سکتے ہیں:

TOKEN = os.getenv("DISCORD_TOKEN")

os.getenv() نامزد ماحولیاتی متغیر تلاش کریں۔ "DISCORD_TOKEN" اور یہ ہمیں اس کی قدر بتاتا ہے۔

آپ یہ بھی چیک کر سکتے ہیں کہ آیا ٹوکن واقعی میں پایا گیا تھا۔

if not TOKEN:
    raise RuntimeError("DISCORD_TOKEN is not set.")

اگر Python ٹوکن تلاش نہیں کر پاتا ہے، تو پروگرام رک جاتا ہے اور بعد میں مبہم انداز میں ناکام ہونے کے بجائے ایک واضح غلطی کا پیغام دکھاتا ہے۔

نیت کو سمجھیں۔

یاد رکھیں کہ ہم نے Python میں پیغام کے مواد کو پڑھنے کی اہلیت کو کیسے فعال کرنے کے بارے میں بات کی تھی؟ ہم اب ایسا کریں گے۔

شامل کریں:

intents = discord.Intents.default()
intents.message_content = True

پہلی لائن Discord کے ارادوں کا ڈیفالٹ سیٹ بناتی ہے۔

دوسری لائن ڈسکارڈ کو بتاتی ہے کہ بوٹ کو پیغام کے مواد تک رسائی کی ضرورت ہے۔

اب آپ کو اپنے بوٹ کو تخلیق کرتے وقت یہ ارادے فراہم کرنے کی ضرورت ہے۔

bot = commands.Bot(
    command_prefix="!",
    intents=intents
)

کہ command_prefix="!" اس کا مطلب ہے کہ ہمارا بوٹ ان کمانڈز کو پہچان لے گا جو اس سے شروع ہوتے ہیں: !.

مثال کے طور پر:

!hello

کہ intents=intents حصہ بوٹ کو اوپر کی گئی اجازتوں کے ساتھ فراہم کرتا ہے۔

اس کے دو مراحل ہیں، کیونکہ ڈسکارڈ کو یہ جاننے کی ضرورت ہے کہ بوٹ پیغام کا مواد وصول کر سکتا ہے، اور پائتھون پروگرام کو ڈسکارڈ کو بتانے کی ضرورت ہے کہ وہ پیغام کا مواد وصول کرنا چاہتا ہے۔

اب پہلے سے طے شدہ ترتیبات یہ ہیں:

import os
import discord

from dotenv import load_dotenv
from discord.ext import commands

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")

if not TOKEN:
    raise RuntimeError("DISCORD_TOKEN is not set.")

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(
    command_prefix="!",
    intents=intents
)

اب ہمارے بوٹ نے ٹوکن کو محفوظ طریقے سے لوڈ کر دیا ہے۔ discord.py جب آپ Discord سے منسلک ہوتے ہیں، تو ہم جانتے ہیں کہ آپ کیا پوچھنا چاہتے ہیں۔

یہ کیا ہے ctx?

ڈسکارڈ بوٹس سیکھتے وقت یہ عجیب لگ سکتا ہے۔

async def hello(ctx):

یہ کیا ہے ctx? ctx مخفف سیاق و سباق. اس میں استعمال شدہ کمانڈ کے بارے میں معلومات موجود ہیں۔

مثال کے طور پر، آپ کہہ سکتے ہیں:

  • جس نے حکم پر عمل کیا۔

  • یہ کس سرور سے ہے؟

  • یہ کس چینل سے آیا ہے؟

  • کس پیغام نے اس کو متحرک کیا؟

پھر:

await ctx.send("Hello!")

طریقہ:

"اس پیغام کو واپس بھیجیں جہاں کمانڈ استعمال کیا گیا تھا۔”

یہ سب کیوں کہتا ہے۔ async اور await?

یہ ہے جو آپ جان سکتے ہیں:

async def hello(ctx):

اور:

await ctx.send(...)

ڈسکارڈ بوٹس انتظار میں کافی وقت گزارتے ہیں۔

وہ انتظار کرتے ہیں:

  • پیغام

  • مماثل ردعمل

  • API کی درخواست

  • ٹائمر

  • دیگر واقعات

Python کی غیر مطابقت پذیر پروگرامنگ کی صلاحیتیں آپ کے بوٹ کو دیگر تمام کارروائیوں میں خلل ڈالے بغیر ان کارروائیوں کا انتظار کرنے کی اجازت دیتی ہیں۔

اپنا پہلا بوٹ بنانے سے پہلے آپ کو غیر مطابقت پذیر پروگرامنگ ماہر بننے کی ضرورت نہیں ہے۔

اب اس کے بارے میں سوچو۔ await جیسے:

"اس کام کو اس وقت تک روکیں جب تک کہ یہ مکمل نہ ہو جائے اور بوٹ کو دوسرے کام کرنے دیں۔”

بوٹ چلائیں۔

کے ساتھ شروع کریں:

python bot.py

اگر سب کچھ کام کرتا ہے تو، آپ کے ٹرمینل کو مندرجہ ذیل سے ملتا جلتا کچھ پرنٹ کرنا چاہئے:

Logged in as StoryBot

اب اپنے Discord سرور پر جائیں اور ٹائپ کریں: !hello. بوٹ کو جواب دینا چاہئے۔

مبارک ہو! آپ نے باضابطہ طور پر اپنا Discord بوٹ بنایا ہے۔

اب آئیے اسے دلچسپ بناتے ہیں۔

کہانی سنانے کے نظام کی تعمیر

سب سے پہلے، آئیے ایک انٹرایکٹو کہانی سنانے کا کمانڈ بنائیں۔

سب سے اوپر bot.pyشامل کریں:

import random

پھر ہم کہانی کے کچھ عناصر بناتے ہیں۔

story_locations = [
    "an abandoned library",
    "a mysterious island",
    "a futuristic city",
    "a hidden underground laboratory",
    "a forest that never appears on maps"
]

story_items = [
    "a glowing key",
    "an ancient notebook",
    "a strange compass",
    "a locked metal box",
    "a mysterious photograph"
]

story_events = [
    "You hear footsteps behind you.",
    "The lights suddenly turn off.",
    "A hidden door opens nearby.",
    "Your phone starts displaying a message from an unknown sender.",
    "You notice that the room has changed."
]

اب درج ذیل کمانڈ لکھیں:

@bot.command()
async def story(ctx):
    location = random.choice(story_locations)
    item = random.choice(story_items)
    event = random.choice(story_events)

    story_text = (
        f"You wake up in {location}.nn"
        f"Next to you is {item}.nn"
        f"{event}nn"
        "What do you do?"
    )

    await ctx.send(story_text)

اب !story آپ تشکیل دے سکتے ہیں:

You wake up in a futuristic city.

Next to you is an ancient notebook.

A hidden door opens nearby.

What do you do?

اسے دوبارہ چلائیں اور آپ کو بالکل مختلف چیز ملے گی۔

یہاں کیوں ہے:

random.choice(...)

ازگر ہر فہرست سے تصادفی طور پر ایک آئٹم کا انتخاب کرتا ہے۔

یہ ایک سادہ تکنیک ہے، لیکن اچانک بوٹ سینکڑوں مختلف امتزاجات پیدا کر سکتا ہے۔

آئیے ایک ایسی کہانی بنائیں جو صارفین کو یاد رکھے

بے ترتیب کہانیاں مزے کی ہوتی ہیں، لیکن انٹرایکٹو کہانیاں اور بھی بہتر ہوتی ہیں جب بوٹ یاد رکھتا ہے کہ کیا ہوا ہے۔

آپ ایک لغت بنا سکتے ہیں:

user_stories = {}

لغت ہر صارف کی کہانی کی معلومات کو ذخیرہ کرتی ہے۔

مثال کے طور پر:

user ID → current story

اب کہانی کی کمانڈ میں ترمیم کرتے ہیں۔

@bot.command()
async def story(ctx):
    user_id = ctx.author.id

    location = random.choice(story_locations)
    item = random.choice(story_items)
    event = random.choice(story_events)

    user_stories[user_id] = {
        "location": location,
        "item": item,
        "event": event
    }

    await ctx.send(
        f"You wake up in {location}.nn"
        f"Next to you is {item}.nn"
        f"{event}nn"
        "What do you do?"
    )

اب ہر صارف کی اپنی ایکٹو کہانی ہو سکتی ہے۔

کہانی کا انتخاب شامل کریں۔

آئیے صارفین کو ایک انتخاب دیں۔

@bot.command()
async def choose(ctx, choice: str):
    user_id = ctx.author.id

    if user_id not in user_stories:
        await ctx.send("You don't have an active story. Try `!story` first.")
        return

    choice = choice.lower()

    if choice == "left":
        response = (
            "You head left and discover a room filled with old maps. "
            "One of them has your name written on it."
        )

    elif choice == "right":
        response = (
            "You head right and find a staircase leading toward "
            "a strange blue light."
        )

    else:
        response = "Try choosing `left` or `right`."

    await ctx.send(response)

اب صارف ٹائپ کر سکتا ہے:

!choose left

یا:

!choose right

براہ کرم درج ذیل کو نوٹ کریں:

async def choose(ctx, choice: str):

کہ choice پیرامیٹرز ایک کمانڈ کے بعد متن لیتے ہیں۔

تو:

!choose left

یہ تقریباً اس طرح ہے:

choice = "left"

یہ ایک وجہ ہے کہ کمانڈ فریم ورک اتنے آسان ہیں۔ کوئی راستہ نہیں کمانڈ فریم ورک ٹولز کا ایک سیٹ جو آپ کے پروگراموں میں کمانڈز بنانا اور ان کا نظم کرنا آسان بناتا ہے۔ ہمارے معاملے میں، discord.py یہ ایک کمانڈ فریم ورک فراہم کرتا ہے جو آپ کو مندرجہ ذیل ڈیکوریٹرز کا استعمال کرتے ہوئے Python فنکشنز کو Discord کمانڈ میں تبدیل کرنے کی اجازت دیتا ہے۔ @bot.command().

ہر پیغام کو دستی طور پر چیک کرنے کے بجائے یہ دیکھنے کے لیے کہ آیا کسی نے اسے ٹائپ کیا ہے۔ !choose, discord.py یہ ہمیں مددگار ہینڈلنگ فراہم کرتا ہے۔ یہ کمانڈ کو پہچانتا ہے، صارف کے دلائل لیتا ہے، اور انہیں فنکشن میں منتقل کرتا ہے۔

لہذا اگر کوئی ٹائپ کرتا ہے:

!choose left

discord.py ہم جانتے ہیں کہ انتخاب ایک حکم ہے۔ "left" دلیل یہ ہے کہ آپ نے ہمیں بلانا ہے۔ choose() یہ اس معلومات پر کام کرتا ہے۔

آرام دہ اور پرسکون چیٹ کمانڈز شامل کی گئیں۔

اب آئیے ایک بوٹ بناتے ہیں جس میں بنیادی بات چیت ہو سکتی ہے۔

آپ اسے ایک بڑے لینگویج ماڈل API میں لگا سکتے ہیں، لیکن آپ کو یہ جاننے کے لیے درحقیقت AI کی ضرورت نہیں ہے کہ چیٹ کمانڈ کیسے کام کرتے ہیں۔ آئیے ایک سادہ کلیدی لفظ پر مبنی رسپانس سسٹم کے ساتھ شروع کریں۔

سب سے پہلے، ہم کچھ مطلوبہ الفاظ اور ممکنہ جوابات پر مشتمل ایک لغت بناتے ہیں۔

chat_responses = {
    "hello": [
        "Hey! What's up?",
        "Hello! How's your day going?",
        "Hi! What are you working on?"
    ],
    "python": [
        "Python is a great language for beginners because its syntax is pretty readable.",
        "If you're learning Python, try building something instead of only watching tutorials."
    ],
    "discord": [
        "Discord bots are a fun way to practice Python because you get instant feedback.",
        "Once you understand commands and events, you can build some surprisingly complex bots."
    ]
}

Think of `chat_responses` as a small collection of things our bot knows how to talk about. Each key, such as `"python"` or `"discord"`, represents a keyword the bot can look for. The value associated with each key is a list of possible responses.

We use a list instead of a single response so the bot doesn't give exactly the same answer every time. Later, we'll randomly choose one of these responses.

Now let's create the actual `!chat` command:

```python
@bot.command()
async def chat(ctx, *, message: str):
    text = message.lower()

    for keyword, responses in chat_responses.items():
        if keyword in text:
            await ctx.send(random.choice(responses))
            return

    await ctx.send(
        "I'm still learning how to respond to that. "
        "Try talking to me about Python or Discord!"
    )

یہاں کچھ چیزیں چل رہی ہیں، تو آئیے ان کو توڑتے ہیں۔

سب سے پہلے، یہ حصہ مندرجہ ذیل ہے.

@bot.command()
async def chat(ctx, *, message: str):

اسے موڑ دیں۔ chat() یہ Discord کمانڈز کے ساتھ کام کرتا ہے۔ کہ * یہ ضروری ہے کیونکہ یہ آپ کو بتاتا ہے۔ discord.py حکم کے بعد ہر چیز کو ایک دلیل سمجھتا ہے۔

مثال کے طور پر، اگر کوئی ٹائپ کرتا ہے:

!chat I want to learn Python

اس کے بعد پورا جملہ !chat کی قدر بن جاتی ہے۔ message:

message = "I want to learn Python"

یہاں مندرجہ ذیل ہے:

text = message.lower()

یہ پیغام کو چھوٹے حروف میں تبدیل کر دے گا۔ دوسرے الفاظ میں Python, pythonاور PYTHON ہر کوئی ہو جائے گا python. اس کے بغیر، مطلوبہ الفاظ کی جانچ سے مماثلتیں چھوٹ سکتی ہیں کیونکہ صارفین الفاظ کو مختلف طریقے سے بڑے کرتے ہیں۔

اب ہم لوپ پر آتے ہیں:

for keyword, responses in chat_responses.items():

.items() آئیے مطلوبہ الفاظ اور ان کی جوابی فہرست دونوں کو دیکھتے ہیں۔ ہر لوپ کے دوران، keyword اس میں درج ذیل ہیں: "python"جبکہ responses متعلقہ جوابات کی فہرست شامل کریں۔

پھر درج ذیل کو چیک کریں:

if keyword in text:

یہ پوچھتا ہے کہ کیا موجودہ مطلوبہ لفظ صارف کے پیغام میں کہیں بھی ظاہر ہوتا ہے۔

اگر صارف لکھتا ہے:

!chat I want to learn Python

لوئر کیس ورژن ہے:

i want to learn python

سے "python" شرط صحیح ہے اگر یہ اس متن میں ظاہر ہو۔

بوٹ پھر بے ترتیب ردعمل کا انتخاب کر سکتا ہے۔

await ctx.send(random.choice(responses))

random.choice() جوابات کی فہرست سے ایک آئٹم منتخب کریں، ctx.send() وہ جواب اپنے Discord چینل کو واپس بھیجیں۔

آخر میں، وہاں ہے:

return

مماثل کلیدی لفظ ملنے پر فنکشن رک جاتا ہے۔ اس کے بغیر، بوٹ کے جواب دینے کے بعد بھی لوپ دوسرے مطلوبہ الفاظ کی جانچ کرتا رہے گا۔

لیکن اگر کوئی مماثل مطلوبہ الفاظ نہ ہوں تو کیا ہوگا؟

یہ حصہ احاطہ کرتا ہے:

await ctx.send(
    "I'm still learning how to respond to that. "
    "Try talking to me about Python or Discord!"
)

اگر کلیدی لفظ تلاش کیے بغیر لوپ ختم ہوجاتا ہے، تو بوٹ اس کی بجائے یہ فال بیک پیغام بھیجتا ہے۔

مثال کے طور پر:

!chat I like pizza

شامل نہیں ہے۔ "hello", "python"یا "discord"لہذا بوٹ کے پاس استعمال کرنے کا کوئی خاص جواب نہیں ہے۔

یہ بوٹس کو AI ماڈل کے بغیر بات چیت کرنے کا ایک آسان طریقہ فراہم کرتا ہے۔

ذہنی صحت کی معاونت کی خصوصیات شامل کی گئیں۔

اب آئیے ان خصوصیات کو دیکھتے ہیں جن پر زیادہ توجہ کی ضرورت ہے۔

اسے اندرونی طور پر "علاج کا حکم” کہنے کے بجائے، ہم اسے کہتے ہیں:

!support

اس سے پہلے کہ ہم شروع کریں فوری اضافی دستبرداری… یہ صرف ایک تفریحی فلاح و بہبود کا اسکرپٹ ہے، ایک حقیقی معالج نہیں!

بنانا:

support_responses = {
    "stress": [
        "That sounds like a lot to handle. Try breaking the situation into one small task at a time.",
        "When everything feels overwhelming, it can help to pause and focus on what needs attention right now."
    ],

    "school": [
        "School can pile up quickly. Consider choosing one assignment to work on first instead of trying to solve everything at once.",
        "If school stress is getting difficult to manage, talking with a trusted person can make things feel less like something you have to handle alone."
    ],

    "sad": [
        "I'm sorry you're having a difficult moment. Taking a short break, doing something calming, or talking with someone you trust may help.",
        "You don't have to solve everything immediately. Give yourself some time and consider reaching out to someone you trust."
    ]
}

اب درج ذیل کمانڈ لکھیں:

@bot.command()
async def support(ctx, *, message: str):
    text = message.lower()

    for keyword, responses in support_responses.items():
        if keyword in text:
            response = random.choice(responses)

            await ctx.send(
                f"{response}nn"
                "I'm a bot, not a therapist or medical professional. "
                "If you need personal support, consider talking with "
                "someone you trust."
            )
            return

    await ctx.send(
        "It sounds like something is bothering you. "
        "I can offer general wellness suggestions, but I'm not a therapist. "
        "If you need personal support, consider reaching out to someone you trust."
    )

اب کوئی ٹائپ کر سکتا ہے:

!support I'm stressed about school

بوٹ مندرجہ ذیل الفاظ کو دیکھتا ہے:

school

اپنے اسکول سے متعلق جوابات میں سے ایک کو منتخب کریں۔

یہ جان بوجھ کر آسان ہے۔

حقیقی عوامی بوٹس کے لیے، آپ صارفین کو حساس حالات میں استعمال کرنے کی اجازت دینے سے پہلے بہت زیادہ احتیاط سے حفاظتی ہینڈلنگ، ٹیسٹنگ، ٹیوننگ، رازداری، اور اضافے کی منطق چاہیں گے۔

مدد کمانڈ شامل کریں۔

ایک اچھے بوٹ کو خود کی وضاحت کرنی چاہئے۔

@bot.command()
async def commands_help(ctx):
    await ctx.send(
        "**Available commands:**n"
        "`!hello` - Say hellon"
        "`!story` - Start a new storyn"
        "`!choose left` - Choose the left pathn"
        "`!choose right` - Choose the right pathn"
        "`!chat ` - Have a casual conversationn"
        "`!support ` - Get general wellness support"
    )

ایک چھوٹا سا مسئلہ ہے۔

Discord کی ڈیفالٹ ہیلپ کمانڈ کو پہلے ہی طلب کیا جا چکا ہے۔ help.

تو اس کے بجائے:

async def help(ctx):

ہم نے اپنا نام درج ذیل رکھا:

commands_help

اگر آپ خود ہی کمانڈ کو طلب کرنا چاہتے ہیں: !helpآپ اسے اس طرح لکھ سکتے ہیں:

@bot.command(name="help")
async def commands_help(ctx):
    ...

یہ ڈسکارڈ کو بتاتا ہے:

استعمال کریں !help اس فنکشن کے لیے، چاہے Python فنکشن کا کوئی مختلف نام ہو۔

خرابی سے نمٹنے میں بہتری

آپ کا بوٹ صرف اس وجہ سے کریش نہیں ہونا چاہیے کہ کسی نے غلط کمانڈ درج کی ہے۔

شامل کریں:

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        await ctx.send(
            "You're missing something. Try `!help` to see how the command works."
        )

    elif isinstance(error, commands.CommandNotFound):
        return

    else:
        print(f"Error: {error}")

اب اگر کوئی ٹائپ کرے:

!chat

بوٹ کو پیغام فراہم کیے بغیر، آپ گفتگو میں مبہم غلطیاں ڈالنے کے بجائے مددگار تبصروں کے ساتھ جواب دے سکتے ہیں۔

سب کچھ ایک ساتھ رکھو

اس موقع پر آپ کی bot.py یہ کچھ اس طرح نظر آسکتا ہے:

import os
import random

import discord
from discord.ext import commands
from dotenv import load_dotenv


load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")

if not TOKEN:
    raise RuntimeError("DISCORD_TOKEN is not set.")


intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(
    command_prefix="!",
    intents=intents
)


story_locations = [
    "an abandoned library",
    "a mysterious island",
    "a futuristic city",
    "a hidden underground laboratory",
    "a forest that never appears on maps"
]

story_items = [
    "a glowing key",
    "an ancient notebook",
    "a strange compass",
    "a locked metal box",
    "a mysterious photograph"
]

story_events = [
    "You hear footsteps behind you.",
    "The lights suddenly turn off.",
    "A hidden door opens nearby.",
    "Your phone starts displaying a message from an unknown sender.",
    "You notice that the room has changed."
]


user_stories = {}


chat_responses = {
    "hello": [
        "Hey! What's up?",
        "Hello! How's your day going?",
        "Hi! What are you working on?"
    ],

    "python": [
        "Python is a great language for beginners because its syntax is pretty readable.",
        "If you're learning Python, try building something instead of only watching tutorials."
    ],

    "discord": [
        "Discord bots are a fun way to practice Python because you get instant feedback.",
        "Once you understand commands and events, you can build some surprisingly complex bots."
    ]
}


support_responses = {
    "stress": [
        "That sounds like a lot to handle. Try breaking the situation into one small task at a time.",
        "When everything feels overwhelming, it can help to pause and focus on what needs attention right now."
    ],

    "school": [
        "School can pile up quickly. Consider choosing one assignment to work on first instead of trying to solve everything at once.",
        "If school stress is getting difficult to manage, talking with a trusted person can make things feel less like something you have to handle alone."
    ],

    "sad": [
        "I'm sorry you're having a difficult moment. Taking a short break, doing something calming, or talking with someone you trust may help.",
        "You don't have to solve everything immediately. Give yourself some time and consider reaching out to someone you trust."
    ]
}


@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")


@bot.command()
async def hello(ctx):
    await ctx.send("Hello! I'm online.")


@bot.command()
async def story(ctx):
    user_id = ctx.author.id

    location = random.choice(story_locations)
    item = random.choice(story_items)
    event = random.choice(story_events)

    user_stories[user_id] = {
        "location": location,
        "item": item,
        "event": event
    }

    await ctx.send(
        f"You wake up in {location}.nn"
        f"Next to you is {item}.nn"
        f"{event}nn"
        "What do you do?"
    )


@bot.command()
async def choose(ctx, choice: str):
    user_id = ctx.author.id

    if user_id not in user_stories:
        await ctx.send(
            "You don't have an active story. Try `!story` first."
        )
        return

    choice = choice.lower()

    if choice == "left":
        response = (
            "You head left and discover a room filled with old maps. "
            "One of them has your name written on it."
        )

    elif choice == "right":
        response = (
            "You head right and find a staircase leading toward "
            "a strange blue light."
        )

    else:
        response = "Try choosing `left` or `right`."

    await ctx.send(response)


@bot.command()
async def chat(ctx, *, message: str):
    text = message.lower()

    for keyword, responses in chat_responses.items():
        if keyword in text:
            await ctx.send(random.choice(responses))
            return

    await ctx.send(
        "I'm still learning how to respond to that. "
        "Try talking to me about Python or Discord!"
    )


@bot.command()
async def support(ctx, *, message: str):
    text = message.lower()

    for keyword, responses in support_responses.items():
        if keyword in text:
            response = random.choice(responses)

            await ctx.send(
                f"{response}nn"
                "I'm a bot, not a therapist or medical professional. "
                "If you need personal support, consider talking with "
                "someone you trust."
            )
            return

    await ctx.send(
        "It sounds like something is bothering you. "
        "I can offer general wellness suggestions, but I'm not a therapist. "
        "If you need personal support, consider reaching out to someone you trust."
    )


@bot.command(name="help")
async def commands_help(ctx):
    await ctx.send(
        "**Available commands:**n"
        "`!hello` - Say hellon"
        "`!story` - Start a new storyn"
        "`!choose left` - Choose the left pathn"
        "`!choose right` - Choose the right pathn"
        "`!chat ` - Have a casual conversationn"
        "`!support ` - Get general wellness support"
    )


@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        await ctx.send(
            "You're missing something. Try `!help` to see how the command works."
        )

    elif isinstance(error, commands.CommandNotFound):
        return

    else:
        print(f"Error: {error}")


bot.run(TOKEN)

یہ حیرت انگیز طور پر قابل ابتدائی ڈسکارڈ پروجیکٹ بنانے کے لیے کافی ہے۔

تاہم، اہم حدود ہیں.

ہمارے بوٹ کو واقعی کچھ یاد نہیں ہے۔

اب تک، ہمارے بوٹ کے ساتھ ایک چھوٹا سا مسئلہ رہا ہے۔ بات یہ ہے کہ بوٹ چھوڑنے کے بعد، اسے اصل میں کچھ یاد نہیں رہتا۔

ابھی ہم کہانی کی معلومات کو ازگر کی لغت میں محفوظ کر رہے ہیں۔

user_stories = {}

یہ اس وقت کام کرتا ہے جب بوٹ چل رہا ہو۔ تاہم، جب میں پروگرام کو روکتا ہوں اور دوبارہ شروع کرتا ہوں، تو لغت خالی شروع ہوجاتی ہے۔

اس مسئلے کو حل کرنے کے لیے، آپ کو اپنے ڈیٹا کو مستقل طور پر ذخیرہ کرنے کے لیے کسی جگہ کی ضرورت ہے۔ وہ جگہ ڈیٹا بیس اندر آو

یہ پروجیکٹ استعمال کرتا ہے: SQLite. SQLite ایک ہلکا پھلکا ڈیٹا بیس ہے جو آپ کے کمپیوٹر پر فائلوں میں معلومات کو محفوظ کرتا ہے۔ ازگر میں پہلے سے ہی SQLite بلٹ ان شامل ہے۔ sqlite3 چونکہ یہ ایک ماڈیول ہے، کسی اضافی تنصیب کی ضرورت نہیں ہے۔

ڈیٹا بیس بنائیں

سب سے پہلے، اس درآمد کو اوپر کے قریب شامل کریں۔ bot.py:

import sqlite3

پھر ڈیٹا بیس فائل سے کنکشن بنائیں۔

db = sqlite3.connect("bot.db")
cursor = db.cursor()

پہلی لائن درج ذیل ڈیٹا بیس فائل بناتی ہے۔ bot.db اگر یہ ابھی تک موجود نہیں ہے۔ اگر فائل پہلے سے موجود ہے تو، SQLite اسے کھولتا ہے۔

دوسری سطر ہے۔ کرسر. ایک کرسر کو ازگر کے پروگرام کے ایک حصے کے طور پر سوچا جا سکتا ہے جو ڈیٹا بیس کو کمانڈ بھیج سکتا ہے۔

اب ہمیں صارف کی کہانی کی معلومات کو ذخیرہ کرنے کے لیے ایک ٹیبل بنانے کی ضرورت ہے۔

cursor.execute("""
    CREATE TABLE IF NOT EXISTS user_stories (
        user_id INTEGER PRIMARY KEY,
        location TEXT,
        item TEXT,
        event TEXT
    )
""")

db.commit()

آئیے اس کا تجزیہ کرتے ہیں۔

cursor.execute() SQLite کو قوسین کے اندر SQL کمانڈ پر عمل کرنے کی ہدایت کرتا ہے۔

ایس کیو ایل کمانڈ اس سے شروع ہوتی ہے:

CREATE TABLE IF NOT EXISTS user_stories

یہ SQLite کو اس طرح کا ٹیبل بنانے کو کہتا ہے: user_storiesتاہم، یہ صرف اس صورت میں لاگو ہوتا ہے جب وہ ٹیبل ابھی موجود نہیں ہے۔

قوسین ان معلومات کی وضاحت کرتے ہیں جو ہر قطار میں شامل کی جا سکتی ہے۔

user_id INTEGER PRIMARY KEY,
location TEXT,
item TEXT,
event TEXT

user_id Discord صارف کی ID اسٹور کرتا ہے۔ ہم اسے اس طرح استعمال کرتے ہیں: PRIMARY KEYاس کا مطلب ہے کہ ہر صارف کی اپنی قطار ہوگی۔

location, itemاور event صارف کی موجودہ کہانی کے بارے میں تمام معلومات۔

آخر میں:

db.commit()

ڈیٹا بیس میں تبدیلیاں محفوظ کریں۔

اس مقام پر، آپ کے پروجیکٹ فولڈر میں ایک نئی فائل ہونی چاہیے جس کا نام ہے:

bot.db

اس فائل کو دستی طور پر کھولنے یا ترمیم کرنے کی ضرورت نہیں ہے۔ SQLite ہمارے لیے اس کا خیال رکھے گی۔

صارف کی کہانی کو محفوظ کریں۔

اب اصل میں ڈیٹا بیس میں معلومات درج کرتے ہیں۔

فرض کریں کہ آپ کے پاس درج ذیل متغیرات ہیں:

user_id = ctx.author.id
location = "an abandoned castle"
item = "a mysterious key"
event = "a locked door"

آپ اسے استعمال کرکے محفوظ کرسکتے ہیں:

cursor.execute(
    """
    INSERT OR REPLACE INTO user_stories
    (user_id, location, item, event)
    VALUES (?, ?, ?, ?)
    """,
    (user_id, location, item, event)
)

db.commit()

ایس کیو ایل کے بیانات SQLite کو معلومات فراہم کرتے ہیں۔ user_stories میز

کہ ? علامتیں اصل اقدار کے لیے جگہ دار ہیں۔ قدریں یہاں الگ سے فراہم کی گئی ہیں۔

(user_id, location, item, event)

یہ دستی طور پر ایس کیو ایل سٹرنگ میں قدریں داخل کرنے سے زیادہ محفوظ ہے۔

INSERT OR REPLACE اس کا مطلب یہ بھی ہے کہ اگر اس صارف کے پاس پہلے سے ہی محفوظ کردہ کہانی ہے، تو ان کی کہانی کی پرانی معلومات کو نئی معلومات سے تبدیل کیا جا سکتا ہے۔

کہانی واپس لو

معلومات کو ذخیرہ کرنا صرف آدھا کام ہے۔ ہمیں اسے تلاش کرنے کے قابل ہونے کی بھی ضرورت ہے۔

آپ اپنے ڈیٹا بیس سے صارف کی کہانیاں اس طرح بازیافت کرسکتے ہیں:

cursor.execute(
    """
    SELECT location, item, event
    FROM user_stories
    WHERE user_id = ?
    """,
    (user_id,)
)

story = cursor.fetchone()

اس بار ہم استعمال کرتے ہیں۔ SELECT SQLite سے معلومات کی درخواست کریں۔

کہ WHERE حصے اہم ہیں:

WHERE user_id = ?

SQLite کو اس مخصوص Discord صارف سے تعلق رکھنے والی قطاریں تلاش کرنے کی ہدایت کرتا ہے۔

پھر:

story = cursor.fetchone()

آپ کو پہلا مماثل نتیجہ ملتا ہے۔

اگر صارف کے پاس محفوظ کردہ کہانی ہے، story ان کی معلومات شامل ہیں۔ اگر نہیں تو story ہو جائے گا None.

ہم اسے چیک کر سکتے ہیں:

if story:
    location, item, event = story

    await ctx.send(
        f"You're currently in {location}. "
        f"You have {item}, and you're facing {event}."
    )
else:
    await ctx.send("I don't have a saved story for you yet!")

بوٹ اب ازگر پروگرام کو دوبارہ شروع کرنے کے بعد بھی پہلے سے محفوظ کردہ معلومات کو بازیافت کرسکتا ہے۔

کمانڈ میں ڈالو

آپ اسے ایک سادہ کمانڈ سے بدل سکتے ہیں جو صارفین کو اپنی محفوظ کردہ کہانیوں کو چیک کرنے کی اجازت دیتا ہے۔

@bot.command()
async def status(ctx):
    user_id = ctx.author.id

    cursor.execute(
        """
        SELECT location, item, event
        FROM user_stories
        WHERE user_id = ?
        """,
        (user_id,)
    )

    story = cursor.fetchone()

    if story:
        location, item, event = story

        await ctx.send(
            f"You're currently in {location}. "
            f"You have {item}, and you're facing {event}."
        )
    else:
        await ctx.send(
            "You don't have a saved story yet. "
            "Start one with `!story`!"
        )

اب صارف ٹائپ کر سکتا ہے:

!status

بوٹ اپنی کہانیوں کو ڈیٹا بیس میں دیکھ سکتا ہے۔

یہ اصل لغت کے مقابلے میں بہت بڑی بہتری ہے۔ ایک لغت صرف معلومات کو یاد رکھتی ہے جب Python پروگرام چل رہا ہو۔ SQLite آپ کو اس معلومات کو محفوظ کرنے کی اجازت دیتا ہے تاکہ بوٹ دوبارہ شروع ہونے پر بھی یہ وہیں موجود رہے۔

بڑے بوٹس کے لیے، وہ بالآخر صارف کی ترجیحات، کہانی کی پیشرفت، انوینٹری، گفتگو کی سرگزشت، یا دیگر ڈیٹا جیسی چیزوں کو اسٹور کر سکتے ہیں۔ لیکن ابھی کے لیے یہ سادہ ڈیٹا بیس بوٹ کو حقیقی میموری فراہم کرنے کے لیے کافی ہے۔

اصلی AI چیٹ شامل کریں۔

اپنے بوٹ کو AI ماڈل سے منسلک کرنے سے پہلے، گلے لگنے والا چہرہ.

اگر آپ نے اسے پہلے استعمال نہیں کیا ہے تو، Hugging Face ڈویلپرز کے لیے مشین لرننگ ماڈلز اور ڈیٹا سیٹس کو دریافت کرنے، اشتراک کرنے اور استعمال کرنے کا ایک پلیٹ فارم ہے۔ اسے AI ٹولز کے لیے ایک بہت بڑی کمیونٹی اور لائبریری سمجھیں۔

Hugging Face ایسے ٹولز بھی فراہم کرتا ہے جو Python پروگراموں کو AI ماڈلز کے ساتھ بات چیت کرنے کی اجازت دیتے ہیں اور انہیں شروع سے ہی تربیت دیے بغیر۔

ہمارے بوٹ کے لیے، ہم Hugging Face استعمال کریں گے۔ اندازہ فراہم کرنے والا صارف کا پیغام معاون زبان کے ماڈل پر بھیجیں اور جواب حاصل کریں۔

ہم براہ راست AI ماڈل کی تربیت نہیں کریں گے۔ اس کے بجائے، ہم ایک موجودہ ماڈل استعمال کریں گے اور اسے Python کے ذریعے اپنے Discord بوٹ سے جوڑیں گے۔

اب جب کہ آپ جانتے ہیں کہ Hugging Face کیا ہے، آئیے اسے اپنے بوٹ سے جوڑتے ہیں۔

ہگ فیس لائبریری انسٹال کریں۔

براہ کرم پہلے انسٹال کریں۔ huggingface_hub:

pip install -U huggingface_hub

ہم پہلے ہی انسٹال کر چکے ہیں۔ python-dotenvتو ہم کچھ استعمال کر سکتے ہیں۔ .env ماخذ کوڈ سے Hugging Face ٹوکن کو خارج کرنے کے لیے پچھلی فائل کو حذف کریں۔

گلے لگانے والے چہرے کا ٹوکن اس میں شامل کریں: .env:

DISCORD_TOKEN=YOUR_BOT_TOKEN_HERE
HF_TOKEN=YOUR_HUGGING_FACE_TOKEN_HERE

تبدیلی YOUR_HUGGING_FACE_TOKEN_HERE اصلی گلے لگانے والے چہرے تک رسائی کے ٹوکن استعمال کریں۔

ڈسکارڈ بوٹ ٹوکنز کی طرح، اس ٹوکن کا اشتراک نہ کریں اور نہ ہی اسے GitHub پر اپ لوڈ کریں۔.

ہگ فیس کلائنٹ بنائیں

اب اس درآمد کو اوپر کے قریب شامل کریں۔ bot.py:

from huggingface_hub import InferenceClient

پھر ٹوکن لوڈ کریں۔

HF_TOKEN = os.getenv("HF_TOKEN")

if not HF_TOKEN:
    raise RuntimeError("HF_TOKEN is not set.")

پہلی لائن کو ماحولیاتی متغیر سے ٹوکن ملتا ہے۔ کہ if بیان چیک کرتا ہے کہ آیا ٹوکن واقعی موجود ہے۔ بصورت دیگر، Python رک جائے گا اور آپ کے پروگرام کو بعد میں مبہم انداز میں ناکام ہونے دینے کے بجائے ایک کارآمد غلطی دکھائے گا۔

اب ہم Hugging Face کلائنٹ بناتے ہیں۔

client = InferenceClient(
    api_key=HF_TOKEN
)

کہ InferenceClient یہ وہی ہے جسے ہمارا Python پروگرام Hugging Face کی انفرنس سروس کے ساتھ بات چیت کرنے کے لیے استعمال کرے گا۔

AI ماڈلز کو بوٹس سے جوڑیں۔

یہ اب پچھلے مطلوبہ الفاظ پر مبنی ایک کو بدل سکتا ہے۔ !chat یہ ایک کمانڈ ہے جو صارف کا پیغام زبان کے ماڈل کو بھیجتی ہے۔

@bot.command()
async def chat(ctx, *, message: str):
    try:
        response = client.chat_completion(
            model="YOUR_SUPPORTED_MODEL_ID",
            messages=[
                {
                    "role": "system",
                    "content": (
                        "You are a friendly Discord bot. "
                        "Keep responses helpful, concise, and conversational."
                    )
                },
                {
                    "role": "user",
                    "content": message
                }
            ],
            max_tokens=200
        )

        answer = response.choices[0].message.content

        await ctx.send(answer)

    except Exception as error:
        print(f"AI error: {error}")
        await ctx.send(
            "I couldn't generate a response right now. "
            "Please try again later."
        )

یہاں بہت کچھ چل رہا ہے، تو آئیے ایک نظر ڈالتے ہیں۔

ہم اسی کمانڈ ڈھانچے کے ساتھ شروع کرتے ہیں جو ہم پہلے ہی استعمال کرتے ہیں۔

@bot.command()
async def chat(ctx, *, message: str):

یہ ہمارا ہے۔ !chat ایک کمانڈ پر عمل کرتا ہے اور اس کے بعد صارف کی ٹائپ کردہ ہر چیز کو محفوظ کرتا ہے۔ message.

مثال کے طور پر:

!chat What is Python?

ہمیں فراہم کرتا ہے:

message = "What is Python?"

اگلا ہم استعمال کرتے ہیں:

try:

یہ Python کو بتاتا ہے کہ ہم کوڈ چلانے والے ہیں جو ممکنہ طور پر ناکام ہو سکتا ہے۔ چونکہ آپ ایک بیرونی سروس کے ساتھ بات چیت کر رہے ہیں، آپ کو غیر دستیاب ماڈلز، غلط ٹوکنز، عارضی کنکشن کے مسائل وغیرہ کا سامنا کرنا پڑ سکتا ہے۔

اب ہم کہتے ہیں:

response = client.chat_completion(

Hugging Face کے ذریعے چیٹ مکمل کرنے کے لیے ماڈل کو درخواست بھیجیں۔ کہ messages پیرامیٹرز میں وہ مکالمہ ہوتا ہے جس کا آپ ماڈل کو جواب دینا چاہتے ہیں۔

پہلے پیغام کا ایک کردار ہوتا ہے۔ "system":

{
    "role": "system",
    "content": (
        "You are a friendly Discord bot. "
        "Keep responses helpful, concise, and conversational."
    )
}

سسٹم کے پیغامات اس بارے میں ہدایات فراہم کرتے ہیں کہ ماڈل کو کیسے جواب دینا چاہیے۔

پھر ہم صارف کا اصل پیغام فراہم کرتے ہیں۔

{
    "role": "user",
    "content": message
}

اگر صارف درج کرتا ہے:

!chat What is Python?

پھر message پر مشتمل ہے:

What is Python?

تو ماڈل اسے صارف سے ان پٹ کے طور پر لیتا ہے۔

ہمارے پاس بھی ہے:

max_tokens=200

یہ متن کی مقدار کو محدود کرتا ہے جو ماڈل ایک جواب کے لیے تیار کر سکتا ہے۔ جوابات کو نسبتاً مختصر رکھنا Discord کے لیے معنی رکھتا ہے۔ کیونکہ چیٹ چینل میں متن کے بڑے بلاکس کو پڑھنا ہمیشہ خوشگوار نہیں ہوتا ہے۔

آپ کو تبدیل کرنے کی بھی ضرورت ہوگی:

model="YOUR_SUPPORTED_MODEL_ID"

اس ماڈل کی ID استعمال کریں جو آپ استعمال کر رہے ہیں ہگ فیس انفرنس فراہم کنندہ کے ذریعے فی الحال دستیاب ہے۔ ہگنگ فیس کے مضمون کے مطابق: InferenceClient آپ چیٹ مکمل کرنے کے لیے Hugging Face Hub پر ہوسٹ کردہ اپنی ماڈل ID استعمال کر سکتے ہیں۔

درخواست مکمل ہونے کے بعد، آپ کو جواب سے اصل متن حاصل کرنا ہوگا۔

answer = response.choices[0].message.content

جواب ماڈل کے آؤٹ پٹ کے بارے میں معلومات پر مشتمل ہے۔ choices[0] پہلا تیار کردہ جواب موصول کریں، .message.content اصل متن فراہم کریں۔

پھر اسے Discord پر بھیجیں۔

await ctx.send(answer)

پورا عمل درج ذیل ہے:

User types !chat
        ↓
Discord sends the command to our bot
        ↓
Python gets the user's message
        ↓
Hugging Face receives the message
        ↓
The AI model generates a response
        ↓
Python gets the generated text
        ↓
The bot sends it back to Discord

AI خرابی سے نمٹنے کے

کمانڈ کا آخری حصہ ہے:

except Exception as error:
    print(f"AI error: {error}")
    await ctx.send(
        "I couldn't generate a response right now. "
        "Please try again later."
    )

اگر اندرونی طور پر کوئی مسئلہ ہے۔ try اگر کوئی بلاک ہے تو، ازگر اگلے ایک پر چھلانگ لگاتا ہے۔ except پورے بوٹ کو کریش کرنے کے بجائے بلاک کر دیتا ہے۔

ٹرمینل پر ایک خرابی پرنٹ کی جائے گی تاکہ آپ اس کی تحقیقات کر سکیں کہ کیا ہوا ہے۔

print(f"AI error: {error}")

دریں اثنا، Discord صارفین کو ایک مختصر پیغام موصول ہوگا:

I couldn't generate a response right now. Please try again later.

یہ API کی خرابی کی وجہ سے آپ کے پورے بوٹ کے کریش ہونے سے کہیں بہتر ہے۔

اس وقت آپ کے پاس ایک حقیقی AI پر مبنی ہے۔ !chat حکم آپ ٹائپ کر سکتے ہیں:

!chat Tell me an interesting fact about space.

ماڈل پہلے سے بنائے گئے پیغامات کی ایک چھوٹی فہرست میں سے انتخاب کرنے کے بجائے جواب پیدا کر سکتا ہے۔

ایک بات یاد رکھیں کہ یہ بوٹ صارف کے پیغامات ایک بیرونی AI سروس کو بھیج رہا ہے۔ اپنے AI فراہم کنندہ کو خودکار طور پر نجی یا حساس گفتگو نہ بھیجیں۔ اگر آپ اس بوٹ کو دوسروں کے لیے دستیاب کراتے ہیں، تو اس بارے میں واضح کریں کہ بوٹ کس معلومات پر کارروائی کر رہا ہے اور بوٹ کو درحقیقت ضرورت سے زیادہ ڈیٹا کو ذخیرہ یا منتقل نہ کریں۔

اس AI سسٹم کو پرانے SQLite ڈیٹا بیس کے ساتھ بھی ملایا جا سکتا ہے۔ مثال کے طور پر، آپ بات چیت کی تاریخ کی ایک محدود مقدار کو ذخیرہ کر سکتے ہیں اور نئے پیغامات کے ساتھ متعلقہ پرانے پیغامات بھیج سکتے ہیں۔ یہ بوٹ کو پیغامات کے درمیان کچھ سیاق و سباق کو برقرار رکھنے کی اجازت دیتا ہے، بجائے اس کے کہ ہر پیغام کو مکمل طور پر نئی گفتگو سمجھیں۔

میں اپنے بوٹ کو آن لائن کیسے رکھ سکتا ہوں؟

جملہ "ہمیشہ کے لیے آن لائن” کی یہاں کچھ وضاحت درکار ہے۔

دو صورتیں ہیں:

آپشن 1: کمپیوٹر سے چلائیں۔

چلتے وقت:

python bot.py

بوٹ آن لائن رہتا ہے جبکہ اس کا پروگرام چل رہا ہے۔

کیا آپ ٹرمینل بند کرنا چاہیں گے؟

بوٹ آف لائن ہو جاتا ہے۔

کیا آپ اپنا کمپیوٹر بند کرنا چاہتے ہیں؟

بوٹ آف لائن ہو جاتا ہے۔

کیا آپ نے انٹرنیٹ کھو دیا؟

بوٹ آف لائن ہو جاتا ہے۔

یہ ترقی کے لیے موزوں ہے، لیکن 24/7 پروڈکشن سیٹ اپ نہیں۔

آپشن 2: سرور پر میزبانی کریں۔

ان بوٹس کے لیے جنہیں آپ کا کمپیوٹر آف ہونے پر بھی آن لائن رہنے کی ضرورت ہے، آپ کو ایک ایسے کمپیوٹر کی ضرورت ہوگی جو اب بھی دستیاب ہو۔

وہ کمپیوٹر کلاؤڈ سرور ہو سکتا ہے۔

اپنا پروجیکٹ اپ لوڈ کریں، انحصار انسٹال کریں، ماحولیاتی متغیرات شامل کریں، اور شروع کریں۔

python bot.py

اب آپ کی کلاؤڈ مشین آپ کے لیپ ٹاپ کے بجائے آپ کے پروگرام چلاتی ہے۔

اس قسم کی ایپلیکیشنز کے لیے، آپ مسلسل کام کے بوجھ کو چلانے کے لیے ڈیزائن کردہ خدمات استعمال کر سکتے ہیں۔ مثال کے طور پر، رینڈر فی الحال فراہم کرتا ہے: پس منظر کارکن مسلسل چلنے والے عمل کے لیے ایک قسم کی سروس جس کو آنے والی ویب ٹریفک حاصل کرنے کی ضرورت نہیں ہے۔

تاہم، آپ کو تعینات کرنے سے پہلے اپنے فراہم کنندہ کی موجودہ قیمتوں اور سروس کی حدود کو چیک کرنا چاہیے۔ ضروری نہیں کہ مفت ہوسٹنگ ٹائرز ہمیشہ آن ڈسکارڈ بوٹس کے لیے ڈیزائن کیے گئے ہوں، اور "مفت ہمیشہ کے لیے” 24/7 سیٹ اپ ایسی چیز نہیں ہے جسے آپ کسی ہوسٹنگ پلیٹ فارم کی پیشکشوں کو مان لیں۔

"ہمیشہ” کا واقعی کیا مطلب ہے۔

واقعی کوئی جادو نہیں ہے۔

ONLINE_FOREVER = True

ماحول

بوٹس صرف اس وقت تک آن لائن رہ سکتے ہیں جب تک کہ ان کو چلانے والا کمپیوٹر یا سرور کام کرتا رہے۔

یہاں تک کہ پیشہ ورانہ طور پر میزبان بوٹس بھی درج ذیل وجوہات کی بناء پر آف لائن ہو سکتے ہیں۔

لہذا ایک حقیقت پسندانہ مقصد یہ ہے کہ بوٹ کو خود بخود چلتا رہے اور اگر کچھ غلط ہو جائے تو اسے دوبارہ شروع کریں۔

پروڈکشن ہوسٹنگ کو آپ کی مدد کے لیے ڈیزائن کیا گیا ہے۔

اگر آپ کا فراہم کنندہ خود کار طریقے سے دوبارہ شروع کرنے کی حمایت کرتا ہے، تو اسے فعال کریں۔

اہم ماحولیاتی متغیرات کی کمی بھی Python کوڈ کے واضح طور پر ناکام ہونے کا سبب بن سکتی ہے۔

if not TOKEN:
    raise RuntimeError("DISCORD_TOKEN is not set.")

کسی پراسرار بوٹ کے مقابلے میں کسی واضح غلطی کو ڈیبگ کرنا بہت آسان ہے جو کبھی آن لائن ظاہر نہیں ہوتا ہے۔

بے ترتیب چالوں کا استعمال کرکے "جاگتے رہنے” کی کوشش نہ کریں۔

آپ ایسے ٹیوٹوریلز تلاش کر سکتے ہیں جو ویب سرور کو تعینات کرنے اور اسے دوسری سروس سے بار بار پنگ کرنے کا مشورہ دیتے ہیں تاکہ آپ کی مفت ہوسٹنگ مثال کو سلیپ موڈ میں جانے سے روکا جا سکے۔

اس نقطہ نظر سے محتاط رہیں۔

ہوسٹنگ فراہم کرنے والے اپنے مفت درجے کے قواعد کو تبدیل کرکے اور ان پابندیوں کے ارد گرد کام کرنے کی کوشش کرکے اپنی شرائط کی خلاف ورزی کرسکتے ہیں۔

اگر آپ کو واقعی مستقل بوٹس کی ضرورت ہے تو ہوسٹنگ آپشن استعمال کریں جو آپ کے کام کے بوجھ کو واضح طور پر سپورٹ کرتا ہو۔

مثال کے طور پر، بیک گراؤنڈ ورکرز کو اس لیے ڈیزائن کیا گیا ہے کہ عمل کو مسلسل چلتا رہے۔ یہ کسی ویب سروس کو قائل کرنے کی کوشش کرنے سے کہیں زیادہ صاف ہے کہ ڈسکارڈ بوٹ خفیہ طور پر ایک ویب سائٹ ہے۔

اضافی خصوصیاتes اور آگے کہاں جانا ہے۔

اب جب کہ آپ کے پاس ایک کام کرنے والا ڈسکارڈ بوٹ ہے، بہت ساری ہدایات ہیں کہ آپ اپنے پروجیکٹ کو آگے لے جا سکتے ہیں۔

آپ انوینٹری، متعدد ابواب، پہیلیاں، یا ایک سے زیادہ اختتام کو شامل کرکے اپنے کہانی سنانے کے نظام کو مزید مکمل گیم میں تبدیل کر سکتے ہیں۔ آپ متن پر مبنی کمانڈز کو Discord سلیش کمانڈز اور بٹنز سے بدل کر اپنے بوٹ کے ساتھ بات چیت کو آسان بنا سکتے ہیں۔

اگر آپ AI میں دلچسپی رکھتے ہیں، تو آپ اپنے بوٹس کو مختلف شخصیات دے کر، بات چیت کے محدود سیاق و سباق کو شامل کر کے، یا کہانی کے کچھ حصے بنانے کے لیے AI کا استعمال کر کے چیٹ سسٹم کو بڑھا سکتے ہیں۔

آپ ایڈمن کی خصوصیات، روزانہ کی کہانی کے اشارے، یا دیگر کمانڈز بھی شامل کر سکتے ہیں جو کہ آپ جس Discord کمیونٹی کی تعمیر کر رہے ہیں اس کے مطابق ہوں۔

یہ وہ خصوصیت نہیں ہے جسے ہم اس ٹیوٹوریل میں مرحلہ وار بنائیں گے، بلکہ اس منصوبے کو بڑھانے کے لیے ایک خیال ہے۔ اہم بات یہ ہے کہ اب آپ کے پاس اپنے تجربات کی بنیاد ہے۔

ایک چھوٹی خصوصیت کے ساتھ شروع کریں، معلوم کریں کہ یہ کیسے کام کرتا ہے، اور وہاں سے تعمیر کریں۔ آپ کو اپنے بوٹ کو ایک ساتھ ایک بڑے پروجیکٹ میں تبدیل کرنے کی ضرورت نہیں ہے۔

آپ جتنا زیادہ کوڈ کے ساتھ تجربہ کریں گے، اتنا ہی زیادہ آپ دیکھیں گے کہ Python، Discord، ڈیٹا بیس، اور AI حقیقی دنیا کی ایپلی کیشنز میں ایک ساتھ کیسے کام کر سکتے ہیں۔

پہلے مقامی طور پر ہر چیز کی جانچ کریں۔

تعینات کرنے سے پہلے درج ذیل کی جانچ کریں:

!hello
!story
!choose left
!choose right
!chat hello
!chat I want to learn Python
!support I'm stressed
!help

پھر ہم عجیب ان پٹ کے لیے ٹیسٹ کرتے ہیں۔

!choose banana
!chat
!support
!unknowncommand

جب میں اپنے کمپیوٹر کے سامنے بیٹھا ہوں تو میں ایک بگ تلاش کرنا چاہوں گا، تین دن بعد نہیں جب کوئی کہے:

"آپ کا بوٹ منگل سے ٹوٹ گیا ہے۔”

بوٹ کی تعیناتی

سب سے پہلے، یقینی بنائیں کہ آپ کے پروجیکٹ پر مشتمل ہے:

discord-story-bot/
│
├── bot.py
├── requirements.txt
├── .gitignore
└── .python-version

کوئی راستہ نہیں .python-version فائل میں مواد شامل ہوسکتا ہے جیسے:

3.13

ورژن فائلز کا استعمال آپ کے تعیناتی کے تجربے کو مزید قابلِ پیشگوئی بنا سکتا ہے۔ رینڈر فی الحال ازگر کے ورژن کی وضاحت کی حمایت کرتا ہے بذریعہ: .python-version یا ماحولیاتی متغیرات۔

آپ کا requirements.txt انحصار شامل کرنا یقینی بنائیں۔

مثال کے طور پر:

discord.py
python-dotenv

تعیناتی کے لیے، آپ کو عام طور پر مقامی کی ضرورت نہیں ہوتی ہے۔ .env فائل

اس کے بجائے، شامل کریں:

DISCORD_TOKEN

آپ کے ہوسٹنگ فراہم کنندہ کے ڈیش بورڈ میں ماحولیاتی متغیر کے طور پر۔

یہ یقینی بناتا ہے کہ آپ کے راز ذخیرے کے اندر محفوظ نہیں ہیں۔

کمانڈ شروع کریں

تعیناتی سروس کو یہ جاننے کی ضرورت ہے کہ کیا چلنا ہے۔

اس پروجیکٹ کے لیے اسٹارٹ اپ کمانڈ یہ ہے:

python bot.py

اہم بات یہ ہے کہ یہ عمل فوری طور پر ختم نہیں ہوتا ہے۔

ڈسکارڈ بوٹس درج ذیل وجوہات کی بناء پر زندہ ہیں۔ bot.run(TOKEN) اپنا ڈسکارڈ کنکشن شروع کریں اور پروگرام چلاتے رہیں۔

اگر آپ کی ہوسٹنگ سروس بیک گراؤنڈ ورکرز کو سپورٹ کرتی ہے، تو یہ اس طرح کے بوٹس کے لیے موزوں ہے، کیونکہ بوٹ کو باقاعدہ HTTP درخواستوں کو ہینڈل کرنے کی ضرورت نہیں ہے۔ رینڈر خاص طور پر پس منظر کے کارکنوں کو مسلسل چلانے والی خدمات کے طور پر بیان کرتا ہے جو آنے والے نیٹ ورک ٹریفک کو نہیں سنتے ہیں۔

یاد رکھیں: اپنے راز کو خفیہ رکھیں۔

یہ دہرانے کے قابل ہے کیونکہ یہ بہت سے ابتدائی منصوبوں کو توڑ دیتا ہے۔

کبھی عہد نہ کریں:

bot.run("YOUR_REAL_TOKEN")

اپ لوڈ نہیں ہوا:

.env

عوامی GitHub ایشو میں اصل ٹوکن چسپاں نہ کریں۔

اگر ٹوکن غلطی سے ظاہر ہو گیا ہے، تو اسے خراب سمجھیں اور اسے دوبارہ تخلیق کریں۔

ماحولیاتی متغیرات آپ کے دوست ہیں۔

میں نے کیا سیکھا۔

آپ نے اب ایک Discord بوٹ بنایا ہے جو کچھ حقیقی دنیا کے پروگرامنگ تصورات کو ظاہر کرتا ہے۔

میں نے سیکھا کہ کیسے:

  • ڈسکارڈ ایپلی کیشن بنائیں

  • Python کو Discord سے جوڑیں۔

  • استعمال کریں discord.py

  • گیٹ وے کے ارادے کو ترتیب دیں۔

  • کمانڈ بنائیں

  • غیر مطابقت پذیر افعال استعمال کریں۔

  • کمانڈ کے دلائل پڑھیں

  • بے ترتیب کہانی کی نسل

  • عارضی صارف کی حالت کو اسٹور کریں۔

  • ایک بنیادی چیٹ سسٹم بنائیں

  • دماغی صحت کی معاونت کی خصوصیت بنائیں

  • کمانڈ ایرر ہینڈلنگ

  • اپنے سورس کوڈ میں راز رکھیں

  • تعیناتی کے لیے منصوبے کی تیاری

  • مستقل ہوسٹنگ کے بارے میں سوچیں۔

اور اس تمام فعالیت کے نیچے، فن تعمیر اب بھی حیرت انگیز طور پر سادہ ہے۔

User sends command
        ↓
Discord receives message
        ↓
discord.py receives event
        ↓
Python function runs
        ↓
Bot generates response
        ↓
Discord displays response

شروع کرنے کے لیے آپ کو کوڈ کی ہزاروں لائنوں کی ضرورت نہیں ہے۔

آپ کو ایک واضح خیال، چند ازگر کے تصورات، اور مسائل کے لامحالہ پیدا ہونے پر ڈیبگنگ جاری رکھنے کی خواہش کی ضرورت ہوگی۔

حتمی خیالات

اس پروجیکٹ کا بہترین حصہ دراصل ڈسکارڈ بوٹ نہیں ہے۔ یہ وہی ہے جو پروجیکٹ آپ کو سکھاتا ہے۔

اور ایک بار جب آپ اسے سمجھ لیں تو آپ اسی آئیڈیا کو ان گنت پروجیکٹس میں دوبارہ استعمال کر سکتے ہیں۔

ڈسکارڈ بوٹ ایک گیم، ایک ویب ایپلیکیشن، یا ایک بڑا سافٹ ویئر پروجیکٹ ہوسکتا ہے۔

اور اچانک آپ اب صرف ازگر کی ترکیب نہیں سیکھ رہے ہیں۔ میں سیکھ رہا ہوں کہ سافٹ ویئر دراصل کس طرح بنایا جاتا ہے، ایک وقت میں ایک ہدایات۔

مبارک کوڈنگ!

اوپر تک سکرول کریں۔