Skip to main content

در این مطلب، قصد ما اینست که کمی با کلاس File در روبی کار کرده و آشنا شویم، این کلاس برای ایجاد، خواندن و نوشتن، و تغییر در مجوز های فایل ها استفاده میگردد. ابتدا، مروری بر کلیدی ترین ویژگی های این کلاس میکنیم و سپس، با استفاده از آن، یک ویرایشگر متنی بسیار ساده مینویسیم.

ایجاد و حذف فایل ها

برای ایجاد یک فایل، کافیست به این شکل عمل کنیم :

File.new("Hello")

با استفاده از این متد، فایلی به نام Hello ایجاد میشود.

برای حذف یک فایل نیز، این چنین عمل میکنیم :

File.delete("Hello")

می توان گفت زمانی که قصد دارید برنامه‌تان خروجی را درون یک فایل (مثلا متنی) قرار دهد، مهم ترین متدهایی هستند که باید از آنها به درستی استفاده کنید. اکنون از این متدها گذشته و میرسیم به متد هایی که برای خواندن و نوشتن استفاده میکنیم.

خواندن و نوشتن

علاوه بر ایجاد و حذف فایل، خواندن و نوشتن نیز مقوله مهمی در کار با فایلهاست. برای خواندن و نوشتن، از دو متد open و close استفاده میشود. متد open همانگونه که از نامش پیداست، فایل مورد نظر را باز کرده و متد close آن را می بندد. گرچه open امکان ایجاد یک فایل جدید را نیز داراست. برای مثال برای چاپ خط به خط یک تکست و سپس بستن فایل در مفسر روبی، کد زیر بسیار کاراست :

f = File.open('text', 'r')
 
for line in f
 puts line
end
 
f.close

در خط اول، فایل را باز کرده و توسط پرچم r ، به مفسر، مجوز خواندن میدهیم. سپس توسط یک حلقه for ، خط به خط برنامه را روی صفحه ترمینال نمایش میدهیم و در آخر توسط متد close فایل مذکور را میبندیم. اکنون یک فایل متنی ایجاد کرده و درونش چند خطی مینویسیم.

f = File.open('text', 'w+')
 
f.write("Hello, World")
f.write("The End")
 
f.close

در اینجا، در خط اول با پرچم +w به مفسر مجوز نوشتن نیز میدهیم. اکنون نوبت آن است که با این ویژگی ها، یک ویرایشگر متنی درست کنیم 🙂 برای نوشتن یک ویرایشگر متن ساده، تنها به چند چیز نیاز داریم، یک کلاس File ، یک حلقه تکرار و خواندن ورودی از طریق کی‌برد :

print 'Enter file name: '
name = gets.chomp
 
f = File.open(name, 'w+')
 
str = ""
while str != "exit\n"
 str = gets
 f.write(str)
end
 
f.close

دقیقا با این کد میتوانید هر چند خط که دلتان خواست، تایپ کرده سپس تایپ کنید exit و در آخر نتیجه را در پوشه ای که کد را اجرا کرده اید، مشاهده فرمایید.

در این مطلب سعی بر آن بود تا پایه ای ترین روش برای کار با فایل ها را مرور کنیم، برای اطلاعات بیشتر در مورد این کلاس، میتوانید راهنمای رسمی آن در وبگاه روبی را مطالعه کنید.

این روزها، در کمتر گروهی است که شاهد حضور یک یا دو بات نباشیم. همچنین، اکثر افراد علاقمند، بسته به سلیقه ها و علاقه هایشان، بات های تلگرام مختلفی را نوشته اند. برای مثال، شخصی باتی نوشته که با دادن پیغام خاصی، شخصی را به گروه اضافه، و یا از گروه حذف میکند، یا بات های دیگری که صرفا برای اسپم کردن در گروه ها، جست و جو در ویکیپدیا  و … نوشته شده اند. برای ساخت یک بات تلگرام، شما نیاز دارید تا توسط اکانت BotFather روبات خود را تعریف کنید. سپس با خواندن مستندات API بات ها، روبات (های) خود را کامل کنید. اما این متد ها و API کد ها، به خودی خود هیچ کاری انجام نمیدهند. بلکه شما هستید که با کدی که برای روبات خود مینویسید، میگویید که چه کند. در این آموزش، ساخت یک روبات کوچک که به دو دستور start و img واکنش نشان میدهد را خواهید آموخت.

نصب جم های مورد نیاز

خوشبختانه برای هر منظوری در روبی، حداقل یک جم وجود دارد. شما میتوانید به صورت مستقیم با تایپ دستور :

gem install telegram-bot-ruby

این جم را نصب کنید و یا یک Gemfile بسازید و بعد محتوای آن را چنین وارد کنید :

source 'https://rubygems.org'
gem 'telegram-bot-ruby'

جهت اطلاعات بیشتر در مورد کار با Bundler ، میتوانید مقاله قبلی همین وبسایت را مطالعه کنید.

شروع به نوشتن روبات

اکنون، جم مورد نیاز ما نصب شده است، روبات خود را با استفاده از BotFather ایجاد کرده ایم، و نوبتی هم باشد نوبت نوشتن کد برای روبات است. یک فایل به نام bot.rb ایجاد میکنیم (توجه کنید که اسم فایل اختیاری است)، و سپس جم مورد نظر را فراخوانی میکنیم. همچنین API خود را درون متغیری به اسم token قرار میدهیم :

require 'telegram/bot'
 
token = 'YOUR API CODE HERE'

سپس، باید دستوری بدهیم که آغاز بات ما باشد :

Telegram::Bot::Client.run(token) do |bot|
end

همانگونه که می بینید، دستور نسبتا طولانی را در متغیری به نام bot خلاصه کردیم. اکنون نوبت آن است که روبات ما، شروع کند به شنیدن آن چه توسط privacy تنظیم کرده ایم (به صورت پیشفرض، روبات ها صرفا به پیام هایی دسترسی دارند که با / شروع می شوند). کل برنامه ما به این شکل خواهد بود:

require 'telegram/bot'
 
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
 
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
  end
end

اکنون میخواهیم بررسی کنیم که از کدام متد ها برای روبات خود استفاده کنیم. همانگونه که در ابتدای مطلب گفته شد، قرار است دو دستور start و img دریافت گردد، و سپس واکنشی نشان داده شود. دستور start میخواهد به کاربر سلام دهد، و دستور img یک عکس برای کاربر بفرستد. پس کد برنامه به این شکل خواهد بود :

require 'telegram/bot'
 
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
 
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
   case message.text
    when '/start'
     bot.api.sendMessage(chat_id: message.chat.id, text: "Hello, @#{message.from.username}")
    when '/img'
     bot.api.sendPhoto(chat_id: message.chat.id, photo: File.new('./image.jpg')
     end
  end
end

ما از دو متد sendMessage برای ارسال متن و sendPhoto برای ارسال تصویر استفاده نمودیم. همچنین، سایر ویژگی های زبان روبی نیز در این کد استفاده شده است. اگر کدهای موجود در این بات ساده، برای شما نا آشناست، بهتر است ابتدا مستندات روبی، سپس مطالب قدیمی همین وبسایت و در نهایت مستندات جم تلگرام بات را مطالعه فرمایید. همچنین، درصورت داشتن سوال، میتوانید در بخش کامنت ها ، سوال خود را مطرح کنید.

معمولا وقتی نیاز باشد از جم های متنوعی در یک برنامه روبی استفاده کنیم، آنها را به این شکل در کد خود فراخوانی میکنیم :

require 'sinatra'
require 'highline/import'
require 'json/ext'

 

و در فایل راهنما، به کاربر برنامه می گوییم تا جم مورد نیاز را توسط دستور gem نصب نماید. اما، چرا جم ها را مستقل از کل سیستم روبی نصب نکنیم؟ تا فقط در دایرکتوری برنامه خودمان معتبر باشند، و کاربر دستورات کمتری را برای نصب جم های مورد نیاز وارد کند. برای این کار، از bundler استفاده میکنیم. (توجه کنید که هم دستور bundle و هم دستور bundler در واقع یکی هستند). برای این که از Bundle استفاده کنیم، نیاز داریم تا یک فایل به اسم Gemfile ایجاد کنیم. سپس درون جم فایل، باید این اطلاعات را وارد نماییم :

  1. سروری که جم ها روی آن قرار دارند
  2. نام جم ها
  3. نسخه مورد نظر جم های مورد نیاز

برای تعریف سرور، کافیست به این شکل عمل کنیم :

source 'https://rubygems.org'

 

به این شکل، Bundler میفهمد که ما از وبسایت rubygems بعنوان منبع جم ها باید استفاده کند. اکنون نیاز است تا جم های مورد نیاز را به Gemfile خود بدهیم. با فرض این که جم های سیناترا را نیاز داریم، در جم فایل چنین مینویسیم :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt'
gem 'mongo'

 

خب، اکنون با اجرای دستور :

bundle install

جمهای مورد نیاز، در دایرکتوری برنامه ما نصب می شوند. اما هنوز یک مشکل داریم، برای مثال sinatra-assetpack ، با نسخه های ۲ به بعد tilt مشکل دارد، پس با این حساب باید نسخه این جم را پایین آوریم، پس در جم فایل این چنین تغییر ایجاد میکنیم :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '1.4.1'
gem 'mongo'

با این کار، Bundler میفهمد که نسخه ۱.۴.۱ از جم tilt را باید نصب کند. اما اگر ندانید آخرین نسخه پایدار tilt چیست چطور؟  باید به شکل زیر عمل کنید :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '< 2.0'
gem 'mongo'

به این شکل، bundler آخرین نسخه پایدار قبل از ۲.۰ را برای ما نصب میکند. در نهایت، جم فایل ما به این شکل در می آید :

source 'https://rubygems.org'
 
gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '<2.0'
gem 'mongo'

برای اطلاعات بیشتر در مورد جم فایل، میتوانید از این پیوند استفاده کنید.