R میں ٹیلیگرام بوٹ لکھنا (حصہ 4): بوٹ کے ساتھ ایک مستقل، منطقی مکالمہ بنانا

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

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

اس آرٹیکل میں ہم یہ بھی سیکھیں گے کہ بوٹ کے نیچے ڈیٹا بیس کو کیسے استعمال کیا جائے، ہماری مثال میں یہ SQLite ہو گا، لیکن آپ کوئی اور DBMS استعمال کر سکتے ہیں۔ میں نے R زبان میں ڈیٹا بیس کے ساتھ بات چیت کے بارے میں مزید تفصیل سے لکھا یہ مضمون.

R میں ٹیلیگرام بوٹ لکھنا (حصہ 4): بوٹ کے ساتھ ایک مستقل، منطقی مکالمہ بنانا

سیریز کے تمام مضامین "R میں ٹیلیگرام بوٹ لکھنا"

  1. ہم ایک بوٹ بناتے ہیں اور اسے ٹیلیگرام میں پیغامات بھیجنے کے لیے استعمال کرتے ہیں۔
  2. بوٹ میں کمانڈ سپورٹ اور میسج فلٹرز شامل کریں۔
  3. بوٹ میں کی بورڈ سپورٹ کیسے شامل کریں۔
  4. بوٹ کے ساتھ ایک مستقل، منطقی مکالمے کی تعمیر

مواد

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

  1. تعارف
  2. بوٹ بنانے کا عمل
  3. بوٹ پروجیکٹ کا ڈھانچہ
  4. بوٹ کی تشکیل
  5. ایک ماحولیاتی متغیر بنائیں
  6. ڈیٹا بیس بنانا
  7. ڈیٹا بیس کے ساتھ کام کرنے کے لیے فنکشن لکھنا
  8. بوٹ طریقے
  9. پیغام کے فلٹرز
  10. سنبھالنے والے
  11. بوٹ لانچ کوڈ
  12. حاصل يہ ہوا

تعارف

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

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

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

اس طرح کے سادہ مکالمے کی صرف تین حالتیں ہوں گی۔

  1. start بوٹ کی عام حالت ہے، جس میں اسے آپ سے کسی قسم کی معلومات کی توقع نہیں ہے۔
  2. wait_name - وہ حالت جس میں بوٹ کسی نام کے داخل ہونے کا انتظار کرتا ہے۔
  3. wait_age وہ حالت ہے جس میں بوٹ آپ کی عمر درج ہونے کا انتظار کرتا ہے، پورے سالوں کی تعداد۔

بوٹ بنانے کا عمل

مضمون کے دوران، ہم قدم بہ قدم ایک بوٹ بنائیں گے؛ اس پورے عمل کو اسکیمیٹک طور پر اس طرح دکھایا جا سکتا ہے:
R میں ٹیلیگرام بوٹ لکھنا (حصہ 4): بوٹ کے ساتھ ایک مستقل، منطقی مکالمہ بنانا

  1. ہم ایک بوٹ کنفیگریشن بناتے ہیں جس میں ہم کچھ سیٹنگز اسٹور کریں گے۔ ہمارے معاملے میں، بوٹ ٹوکن، اور ڈیٹا بیس فائل کا راستہ۔
  2. ہم ایک ماحولیاتی متغیر بناتے ہیں جس میں بوٹ کے ساتھ پروجیکٹ کا راستہ محفوظ کیا جائے گا۔
  3. ہم خود ڈیٹا بیس بناتے ہیں، اور متعدد فنکشنز تاکہ بوٹ اس کے ساتھ تعامل کر سکے۔
  4. ہم بوٹ طریقے لکھتے ہیں، یعنی افعال جو یہ انجام دے گا۔
  5. پیغام کے فلٹرز شامل کرنا۔ جس کی مدد سے بوٹ چیٹ کی موجودہ حالت کے لحاظ سے ضروری طریقوں تک رسائی حاصل کر سکے گا۔
  6. ہم ایسے ہینڈلرز شامل کرتے ہیں جو ضروری بوٹ طریقوں سے کمانڈز اور پیغامات کو جوڑیں گے۔
  7. آئیے بوٹ لانچ کریں۔

بوٹ پروجیکٹ کا ڈھانچہ

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

  • bot.R - ہمارے بوٹ کا بنیادی کوڈ
  • db_bot_function.R - ڈیٹا بیس کے ساتھ کام کرنے کے افعال کے ساتھ کوڈ کا ایک بلاک
  • bot_methods.R - بوٹ طریقوں کا کوڈ
  • message_filters.R - پیغام کے فلٹرز
  • ہینڈلرز. آر - ہینڈلرز
  • config.cfg - بوٹ کی تشکیل
  • create_db_data.sql - ڈیٹا بیس میں چیٹ ڈیٹا کے ساتھ ٹیبل بنانے کے لیے SQL اسکرپٹ
  • create_db_state.sql - ڈیٹا بیس میں موجودہ چیٹ کی حالت کا ٹیبل بنانے کے لیے SQL اسکرپٹ
  • bot.db - بوٹ ڈیٹا بیس

آپ پورے بوٹ پروجیکٹ کو دیکھ سکتے ہیں، یا ڈاؤن لوڈ، اتارنا میری طرف سے GitHub پر ذخیرہ.

بوٹ کی تشکیل

ہم حسب معمول استعمال کریں گے۔ ini فائلمندرجہ ذیل فارم:

[bot_settings]
bot_token=ТОКЕН_ВАШЕГО_БОТА

[db_settings]
db_path=C:/ПУТЬ/К/ПАПКЕ/ПРОЕКТА/bot.db

تشکیل میں ہم بوٹ ٹوکن اور ڈیٹا بیس کا راستہ لکھتے ہیں، یعنی bot.db فائل میں؛ ہم اگلے مرحلے میں فائل خود بنائیں گے۔

زیادہ پیچیدہ بوٹس کے لیے، آپ زیادہ پیچیدہ کنفیگرز بنا سکتے ہیں، اس کے علاوہ، ini config لکھنا ضروری نہیں ہے، آپ JSON سمیت کوئی اور فارمیٹ استعمال کر سکتے ہیں۔

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

ہر پی سی پر، بوٹ پروجیکٹ والا فولڈر مختلف ڈائریکٹریز اور مختلف ڈرائیوز پر واقع ہوسکتا ہے، اس لیے کوڈ میں پروجیکٹ فولڈر کا راستہ ماحولیاتی متغیر کے ذریعے سیٹ کیا جائے گا۔ TG_BOT_PATH.

ماحولیاتی متغیر بنانے کے کئی طریقے ہیں، سب سے آسان اسے فائل میں لکھنا ہے۔ .رینوائرون.

آپ کمانڈ کا استعمال کرکے اس فائل کو بنا یا ترمیم کرسکتے ہیں۔ file.edit(path.expand(file.path("~", ".Renviron"))). اس پر عمل کریں اور فائل میں ایک لائن شامل کریں:

TG_BOT_PATH=C:/ПУТЬ/К/ВАШЕМУ/ПРОЕКТУ

اگلا فائل محفوظ کریں۔ .رینوائرون اور RStudio کو دوبارہ شروع کریں۔

ڈیٹا بیس بنانا

اگلا مرحلہ ڈیٹا بیس بنانا ہے۔ ہمیں 2 میزوں کی ضرورت ہوگی:

  • chat_data — وہ ڈیٹا جس کی بوٹ نے صارف سے درخواست کی تھی۔
  • chat_state - تمام چیٹس کی موجودہ حالت

آپ درج ذیل ایس کیو ایل استفسار کا استعمال کرتے ہوئے یہ جدولیں بنا سکتے ہیں۔

CREATE TABLE chat_data (
    chat_id BIGINT  PRIMARY KEY
                    UNIQUE,
    name    TEXT,
    age     INTEGER
);

CREATE TABLE chat_state (
    chat_id BIGINT PRIMARY KEY
                   UNIQUE,
    state   TEXT
);

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

# Скрипт создания базы данных
library(DBI)     # интерфейс для работы с СУБД
library(configr) # чтение конфига
library(readr)   # чтение текстовых SQL файлов
library(RSQLite) # драйвер для подключения к SQLite

# директория проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# чтение конфига
cfg <- read.config('config.cfg')

# подключение к SQLite
con <- dbConnect(SQLite(), cfg$db_settings$db_path)

# Создание таблиц в базе
dbExecute(con, statement = read_file('create_db_data.sql'))
dbExecute(con, statement = read_file('create_db_state.sql'))

ڈیٹا بیس کے ساتھ کام کرنے کے لیے فنکشن لکھنا

ہمارے پاس پہلے سے ہی ایک کنفیگریشن فائل تیار ہے اور ایک ڈیٹا بیس بنایا گیا ہے۔ اب آپ کو اس ڈیٹا بیس میں ڈیٹا پڑھنے اور لکھنے کے لیے فنکشن لکھنے کی ضرورت ہے۔

اگر آپ نے پروجیکٹ کو ڈاؤن لوڈ کیا ہے۔ GitHub کے، پھر آپ فائل میں افعال تلاش کرسکتے ہیں۔ db_bot_function.R.

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

# ###########################################################
# Function for work bot with database

# получить текущее состояние чата
get_state <- function(chat_id) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  chat_state <- dbGetQuery(con, str_interp("SELECT state FROM chat_state WHERE chat_id == ${chat_id}"))$state

  return(unlist(chat_state))

  dbDisconnect(con)
}

# установить текущее состояние чата
set_state <- function(chat_id, state) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_state (chat_id, state)
                VALUES(${chat_id}, '${state}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET state='${state}';
            ")
  )

  dbDisconnect(con)

}

# запись полученных данных в базу
set_chat_data <- function(chat_id, field, value) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_data (chat_id, ${field})
                VALUES(${chat_id}, '${value}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET ${field}='${value}';
            ")
  )

  dbDisconnect(con)

}

# read chat data
get_chat_data <- function(chat_id, field) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  data <- dbGetQuery(con, 
                     str_interp("
            SELECT ${field}
            FROM chat_data
            WHERE chat_id = ${chat_id};
            ")
  )

  dbDisconnect(con)

  return(data[[field]])

}

ہم نے 4 آسان فنکشنز بنائے ہیں:

  • get_state() - ڈیٹا بیس سے چیٹ کی موجودہ حالت حاصل کریں۔
  • set_state() - ڈیٹا بیس میں موجودہ چیٹ کی حالت لکھیں۔
  • get_chat_data() - صارف کے ذریعہ بھیجے گئے ڈیٹا کو وصول کریں۔
  • set_chat_data() - صارف سے موصول ہونے والے ڈیٹا کو ریکارڈ کریں۔

تمام افعال کافی آسان ہیں، وہ یا تو کمانڈ کا استعمال کرتے ہوئے ڈیٹا بیس سے ڈیٹا پڑھتے ہیں۔ dbGetQuery()، یا عہد کریں۔ UPSERT فنکشن کا استعمال کرتے ہوئے آپریشن (موجودہ ڈیٹا کو تبدیل کرنا یا ڈیٹا بیس میں نیا ڈیٹا لکھنا) dbExecute().

UPSERT آپریشن کے لیے نحو درج ذیل ہے:

INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}') 
ON CONFLICT(chat_id) 
DO UPDATE SET ${field}='${value}';

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

اگلا، ہم ان فنکشنز کو بوٹ کے طریقوں اور فلٹرز میں استعمال کریں گے۔

بوٹ طریقے

ہمارے بوٹ کی تعمیر کا اگلا مرحلہ طریقوں کو بنانا ہے۔ اگر آپ نے پروجیکٹ کو ڈاؤن لوڈ کیا ہے۔ GitHub کے، پھر تمام طریقے فائل میں ہیں۔ bot_methods.R.

بوٹ طریقہ کوڈ

# ###########################################################
# bot methods

# start dialog
start <- function(bot, update) {

  # 

  # Send query
  bot$sendMessage(update$message$chat_id, 
                  text = "Введи своё имя")

  # переключаем состояние диалога в режим ожидания ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_name')

}

# get current chat state
state <- function(bot, update) {

  chat_state <- get_state(update$message$chat_id)

  # Send state
  bot$sendMessage(update$message$chat_id, 
                  text = unlist(chat_state))

}

# reset dialog state
reset <- function(bot, update) {

  set_state(chat_id = update$message$chat_id, state = 'start')

}

# enter username
enter_name <- function(bot, update) {

  uname <- update$message$text

  # Send message with name
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(uname, ", приятно познакомится, я бот!"))

  # Записываем имя в глобальную переменную
  #username <<- uname
  set_chat_data(update$message$chat_id, 'name', uname) 

  # Справшиваем возраст
  bot$sendMessage(update$message$chat_id, 
                  text = "Сколько тебе лет?")

  # Меняем состояние на ожидание ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_age')

}

# enter user age
enter_age <- function(bot, update) {

  uage <- as.numeric(update$message$text)

  # проверяем было введено число или нет
  if ( is.na(uage) ) {

    # если введено не число то переспрашиваем возраст
    bot$sendMessage(update$message$chat_id, 
                    text = "Ты ввёл некорректные данные, введи число")

  } else {

    # если введено число сообщаем что возраст принят
    bot$sendMessage(update$message$chat_id, 
                    text = "ОК, возраст принят")

    # записываем глобальную переменную с возрастом
    #userage <<- uage
    set_chat_data(update$message$chat_id, 'age', uage) 

    # сообщаем какие данные были собраны
    username <- get_chat_data(update$message$chat_id, 'name')
    userage  <- get_chat_data(update$message$chat_id, 'age')

    bot$sendMessage(update$message$chat_id, 
                    text = paste0("Тебя зовут ", username, " и тебе ", userage, " лет. Будем знакомы"))

    # возвращаем диалог в исходное состояние
    set_state(chat_id = update$message$chat_id, state = 'start')
  }

}

ہم نے 5 طریقے بنائے:

  • شروع کریں - ایک ڈائیلاگ شروع کریں۔
  • ریاست - موجودہ چیٹ کی حالت حاصل کریں۔
  • reset — موجودہ چیٹ کی حالت کو دوبارہ ترتیب دیں۔
  • enter_name — بوٹ آپ کا نام پوچھتا ہے۔
  • enter_age — بوٹ آپ کی عمر پوچھتا ہے۔

طریقہ۔ start آپ کا نام پوچھتا ہے، اور چیٹ کی حالت کو تبدیل کرتا ہے۔ انتظار_نام، یعنی اپنا نام درج کرنے کے لیے تیار رہنا۔

اگلا، آپ نام بھیجتے ہیں اور اس پر طریقہ کار سے کارروائی ہوتی ہے۔ enter_name، بوٹ آپ کو سلام کرتا ہے، موصولہ نام کو ڈیٹا بیس میں لکھتا ہے، اور چیٹ کو ریاست میں بدل دیتا ہے۔ انتظار_عمر.

اس مرحلے پر، بوٹ آپ سے اپنی عمر میں داخل ہونے کی توقع کرتا ہے۔ آپ اپنی عمر بھیجتے ہیں، بوٹ پیغام کو چیک کرتا ہے، اگر آپ نے نمبر کے بجائے کچھ متن بھیجا تو یہ کہے گا: Ты ввёл некорректные данные, введи число، اور آپ کے ڈیٹا کو دوبارہ درج کرنے کا انتظار کرے گا۔ اگر آپ نے کوئی نمبر بھیجا ہے، تو بوٹ اطلاع دے گا کہ اس نے آپ کی عمر کو قبول کر لیا ہے، موصول ہونے والا ڈیٹا ڈیٹا بیس میں لکھے گا، آپ سے موصول ہونے والے تمام ڈیٹا کی اطلاع دے گا اور چیٹ کی حالت کو اس کی اصل پوزیشن پر واپس کر دے گا، یعنی وی start.

طریقہ کو بلا کر state آپ کسی بھی وقت موجودہ چیٹ اسٹیٹس کی درخواست کر سکتے ہیں، اور استعمال کر سکتے ہیں۔ reset چیٹ کو اس کی اصل حالت میں لوٹائیں۔

پیغام کے فلٹرز

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

پر منصوبے میں GitHub کے فلٹرز فائل میں رجسٹرڈ ہیں۔ message_filters.R.

پیغام فلٹر کوڈ:

# ###########################################################
# message state filters

# фильтр сообщений в состоянии ожидания имени
MessageFilters$wait_name <- BaseFilter(function(message) {
  get_state( message$chat_id )  == "wait_name"
}
)

# фильтр сообщений в состоянии ожидания возраста
MessageFilters$wait_age <- BaseFilter(function(message) {
  get_state( message$chat_id )   == "wait_age"
}
)

فلٹرز میں ہم پہلے لکھا ہوا فنکشن استعمال کرتے ہیں۔ get_state()چیٹ کی موجودہ حالت کی درخواست کرنے کے لیے۔ اس فنکشن کے لیے صرف 1 دلیل، چیٹ آئی ڈی کی ضرورت ہے۔

اگلا فلٹر انتظار_نام جب چیٹ حالت میں ہو تو پیغامات پر کارروائی کرتا ہے۔ wait_name، اور اس کے مطابق فلٹر انتظار_عمر جب چیٹ حالت میں ہو تو پیغامات پر کارروائی کرتا ہے۔ wait_age.

سنبھالنے والے

ہینڈلرز والی فائل کو کہا جاتا ہے۔ ہینڈلرز. آر، اور درج ذیل کوڈ ہے:

# ###########################################################
# handlers

# command handlers
start_h <- CommandHandler('start', start)
state_h <- CommandHandler('state', state)
reset_h <- CommandHandler('reset', reset)

# message handlers
## !MessageFilters$command - означает что команды данные обработчики не обрабатывают, 
## только текстовые сообщения
wait_age_h  <- MessageHandler(enter_age,  MessageFilters$wait_age  & !MessageFilters$command)
wait_name_h <- MessageHandler(enter_name, MessageFilters$wait_name & !MessageFilters$command)

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

اگلا، ہم پچھلے مرحلے میں بنائے گئے فلٹرز کا استعمال کرتے ہوئے 2 میسج ہینڈلرز بناتے ہیں، اور ان میں ایک فلٹر شامل کرتے ہیں۔ !MessageFilters$command، تاکہ ہم کسی بھی چیٹ حالت میں کمانڈ استعمال کر سکیں۔

بوٹ لانچ کوڈ

اب ہمارے پاس لانچ کرنے کے لیے سب کچھ تیار ہے، بوٹ کو لانچ کرنے کا مرکزی کوڈ فائل میں ہے۔ bot.R.

library(telegram.bot)
library(tidyverse)
library(RSQLite)
library(DBI)
library(configr)

# переходим в папку проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# читаем конфиг
cfg <- read.config('config.cfg')

# создаём экземпляр бота
updater <- Updater(cfg$bot_settings$bot_token)

# Загрузка компонентов бота
source('db_bot_function.R') # функции для работы с БД
source('bot_methods.R')     # методы бота
source('message_filters.R') # фильтры сообщений
source('handlers.R') # обработчики сообщений

# Добавляем обработчики в диспетчер
updater <- updater +
  start_h +
  wait_age_h +
  wait_name_h +
  state_h +
  reset_h

# Запускаем бота
updater$start_polling()

نتیجے کے طور پر، ہمیں یہ بوٹ ملا:
R میں ٹیلیگرام بوٹ لکھنا (حصہ 4): بوٹ کے ساتھ ایک مستقل، منطقی مکالمہ بنانا

کسی بھی وقت کمانڈ کا استعمال کرتے ہوئے /state ہم موجودہ چیٹ کی حالت سے استفسار کر سکتے ہیں، اور کمانڈ کا استعمال کر کے /reset چیٹ کو اس کی اصل حالت میں واپس کریں اور دوبارہ مکالمہ شروع کریں۔

حاصل يہ ہوا

اس مضمون میں، ہم نے معلوم کیا کہ بوٹ کے اندر ڈیٹا بیس کا استعمال کیسے کیا جائے، اور چیٹ کی حالت کو ریکارڈ کرکے ترتیب وار منطقی مکالمے کیسے بنائے جائیں۔

اس معاملے میں، ہم نے سب سے قدیم مثال کو دیکھا، تاکہ آپ کے لیے ایسے بوٹس بنانے کے خیال کو سمجھنا آسان ہو؛ عملی طور پر، آپ بہت زیادہ پیچیدہ مکالمے بنا سکتے ہیں۔

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

ماخذ: www.habr.com

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