سلام

در این مقاله با روند ساخت یک بات در لیمو آشنا می‌شویم.
در صورتی که نمی‌دانید لیمو چیست، توصیه می‌کنیم پیش از ادامه به این مقاله مراجعه نمایید.

برای کار با لیمو SDKهایی به زبان‌های جاوا و پایتون وجود دارد که از گیت‌هاب قابل دسترسی هستند (https://github.com/limoo-im). در این مقاله از SDK جاوا استفاده می‌کنیم.

ایجاد کاربر بات #

یک بات در لیمو در واقع کاربری است که رفتارش را برنامه‌نویس مشخص می‌کند؛ پس اولین مرحله ساختن یک کاربر است. برای ساختن کاربر بات از دستور «ساخت-بات»‌ استفاده می‌کنیم. این دستور توسط مدیر (ادمین) فضای کاری در پیام شخصی‌اش با «لیموبات» استفاده می‌شود. پارامترهای این دستور نام کاربری بات و نام نمایشی آن هستند. قالب استفاده از این دستور به این صورت است:

‍‍‍‍‍‍/ساخت-بات نام-کاربری-بات نام-نمایشی-بات

پس از اجرای این دستور اطلاعات تکمیلی (مانند رمز عبور بات) را می‌توانیم در رشتهٔ پیام ببینیم. نمونه‌ای از اجرای این دستور را در تصویر زیر مشاهده می‌کنیم:

اجرای دستور ساخت بات

 

استفاده از SDK #

پس از ایجاد کاربر بات، می‌توانیم وارد کد شویم. برای استفاده از SDK جاوایی لیمو، فایل jar آن را از https://github.com/limoo-im/java-sdk/releases دانلود نموده و به نیازمندی‌ها پروژه‌مان اضافه می‌کنیم. همچنین نیازمندی‌های SDK را نیز باید به پروژه اضافه کنیم. این نیازمندی‌ها عبارتند از:

com.squareup.okhttp3:okhttp:3.14.4
com.squareup.okhttp3:okhttp-urlconnection:3.14.4
com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.2.3
com.fasterxml.jackson.core:jackson-databind:2.9.10
log4j:log4j:1.2.16
org.slf4j:slf4j-log4j12:1.6.1
org.atmosphere:wasync:1.4.3

 

برای اتصال به سامانهٔ لیمو، باید یک نمونهٔ جدید از موجودیت‌ LimooDriver ایجاد کنیم. برای این کار، به آدرس دامنهٔ لیمو، کلید فضای کاری مورد نظر، نام کاربری و رمز عبور کاربر بات نیاز داریم:

LimooDriver limooDriver = new LimooDriver("https://web.limoo.im/Limonad", "bot-creation", "my-bot", "io1hlzkj53li19dtvyfg");

 

کلید فضای کاری عبارتی است که بعد از «workspace» در url سامانه مشاده می‌کنیم:

کلید فضای کاری برای ساخت بات

توجه داشته باشیم که LimooDriver اینترفیس Closeable را پیاده‌سازی می‌کند، لذا بعد از آنکه کارمان با LimooDriver به پایان رسید برای آزادسازی منابع باید آن را close کنیم:

limooDriver.close();
دریافت گروه‌های کاربر #

موجودیت Conversation رابط کار با گروه‌ها را در اختیار ما قرار می‌دهد. بدین صورت می‌توانیم یک Conversation را با استفاده از شناسهٔ یکتا (ID)‌ آن بدست آوریم:

Conversation c = limooDriver.getConversationById("b3d139ca-2ad1-44f9-b7c0-e5afe37d732f");

شناسهٔ یکتای Conversation را می‌توانیم در url بعد از عبارت channels مشاهده کنیم:

شناسه یکتای گروه

 

همچنین می‌توانیم همهٔ گروه‌هایی که بات در آن‌ها عضو است را بگیریم:

List<Conversation> conversations = limooDriver.getConversations();
دریافت پیام‌های ارسال‌شده در گروه #

حال بازیابی پیام‌های موجود در گروه c ساده است:

List<Message> unreadMessages = c.getUnreadMessages();

 

این روش پیام‌های جدید گروه را به ما می‌دهد. منظور از پیام‌های جدید پیام‌هایی است که قبلا دریافت نکرده‌ایم.

برای دریافت پیام‌ها به محض ارسال در گروه، یک نمونهٔ جدید از کلاس MessageCreatedEventListener ایجاد کرده و آن را به limooDriver معرفی می‌کنیم. برای ایجاد این نمونه باید گروه مورد نظر را به constructorش بدهیم و متد onNewMessage آن را override کنیم:

limooDriver.registerEventListener(new MessageCreatedEventListener(c) {
@Override
public void onNewMessage(Message msg) {
System.out.println(msg.getText());
}
});

دریافت فایل‌های پیوست یک پیام هم سرراست است:

@Override
public void onNewMessage(Message msg) {
if (msg.getFiles() != null) {
for (MessageFile messageFile : msg.getFiles()) {
try (InputStream inputStream = messageFile.download()) {
// Do whatever with the stream
} catch (IOException | LimooException e) {
e.printStackTrace();
}
}
}
}

 

ارسال پیام در گروه #

ارسال یک پیام در گروه c بدین شکل است:

c.send("Hi everyone!");

برای دسترسی به امکانات بیشتر در ارسال پیام می‌توانیم از قابلیت Builder موجودیت Message استفاده کنیم. مثلا در زیر فایلی با نام test.txt را به همراه پیام ارسال می‌کنیم:

c.send(new Message.Builder().text("Here's a file!").file(new File("test.txt")));

همچنین می‌توانیم در یک رشته نیز پیام جدید بفرستیم:

@Override
public void onNewMessage(Message msg) {
if (msg.getThreadRootId() == null) {
c.send(new Message.Builder().text("msg received").threadRootId(msg.getId()));
}
}

 

در این حالت باید توجه کنیم که در پیام‌های درون یک رشته،‌ مقدار threadRootId برابر با ID پیام اصلی (ریشه) رشته است و در پیام اصلی رشته این مقدار برابر با null است؛ لذا یک پیام در صورتی می‌تواند ریشهٔ یک رشته باشد که threadRootId آن null باشد.

مثالی از یک بات #

یک نمونه بات ساده در مخزن وجود دارد که می‌تواند راهنمای شما برای آشنایی بیشتر با SDK باشد:

https://github.com/limoo-im/java-sdk/blob/master/src/test/java/ir/limoo/driver/SimpleResponder.java

این بات به یک گروه متصل می‌شود، محتوای پیام‌ها و فایل‌های متنی ارسالی در آن را چاپ می‌کند و در پاسخ به پیام‌های ارسالی یک فایل می‌فرستد.


امیدواریم از کار با لیمو لذت ببرید و بات‌های متنوعی بسازید 🙂
ان‌شاءالله به مرور قابلیت‌های جدید به SDKهای لیمو اضافه می‌شود.

ورود به لیمو