امکانات پیشرفته چت - قسمت دوم

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

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

پیش‌نیازها

  1. در صورتی که با سرویس بلادرنگ آشنایی ندارید، به معرفی سرویس بلادرنگ مراجعه کنید.
  2. در صورتی که هنوز با تنظیمات پنل سرویس بلادرنگ آشنا نشده اید، به تنظیمات پنل سرویس بلادرنگ مراجعه کنید.
  3. اگر هنوز SDK اندروید را راه‌اندازی نکرده‌اید، به راه‌اندازی SDK اندروید مراجعه کنید.
  4. در صورتی که با نحوه ایجاد یک چت ساده به کمک سرویس بلادرنگ آشنایی ندارید، مستند اتصال ساده و ارسال پیام را حتما مطالعه کنید.
  5. این مستند ادامه قسمت اول امکانات چت پیشرفته است و نیاز است که نگاهی به قسمت اول بیاندازید.

مفهوم Listener

در صورتی که در SDK بکتوری، شما سرویس بلادرنگ را فعال کنید، پیام‌هایی که برای کاربر فعلی شما ارسال می‌شود، مانند چت مستقیم و یا پیامی در یک گروه، منطقا می‌بایست به دست کاربر شما برسند. در صورتی که یک اپلیکیشن چت می‌نویسید، قطعا علاقه‌مند هستید که این پیام‌ها در جایی از کد به دست شما برسد تا بتوانید بر اساس اتفاقات مختلف، چیزی به کاربر نمایش دهید و او را در جریان بگذارید. مثلا اگر پیامی از دوستش به دست وی رسید، نوتیفیکیشنی در صفحه برایش ظاهر شود، اگر به گروهی دعوت شد، در جایی لیست دعوت‌هایی که در حالت Pending است را مشاهده کرده و تایید یا رد کند و … .

راه‌کاری که بکتوری برای این مسئله دارد، استفاده از Listener می‌باشد. همانطور که ادامه خواهید دید، Listener یک Interface در محیط Android است که شما باید آن را به نحوه‌ای که دوست دارید پیاده‌سازی کنید. کد زیر یک پیاده‌سازی بسیار ساده از تمامی توابع Listener مورد نیاز برای این قسمت را نشان می‌دهد. (توضیح دقیق بعد از کد)

public class MainClass implements ChatListener, RealtimeSdkListener {

    public void init() {
        BacktoryRealtimeAndroidApi backtoryApi =
                BacktoryRealtimeAndroidApi.getInstance();

        // Set required listener
        backtoryApi.setRealtimeSdkListener(this);

        // Set chat listener
        backtoryApi.setChatListener(this);

        // Connect to backtory
        backtoryApi.connectAsync(new BacktoryCallBack<ConnectResponse>() {
            @Override
            public void onResponse(BacktoryResponse<ConnectResponse> response) {
                // Check if connected Successful
                if (response.isSuccessful()) {
                    Log.d("TAG", "Connected: " + response.body().getUsername() + ":"
                            + response.body().getUserId());
                } else {
                    Log.d("TAG", "Connect failed with code: " + response.code()
                            + " and message: " + response.message());
                }
            }
        });
    }

    /*********** Start Chat Listener Functions ************/
    @Override
    public void onChatMessage(SimpleChatMessage simpleChatMessage) {
        // TODO: Handle all friends' chat messages here
    }

    @Override
    public void onPushMessage(SimpleChatMessage simpleChatMessage) {
        // TODO: Handle direct push messages here
    }

    @Override
    public void onGroupPushMessage(SimpleChatMessage simpleChatMessage) {
        // TODO: Handle bulk push messages here
    }

    @Override
    public void onGroupChatMessage(SimpleChatMessage simpleChatMessage) {
        // TODO: Handle group messages here (chat messages that belong to a group)
    }

    @Override
    public void onChatInvitationMessage(ChatInvitationMessage chatInvitationMessage) {
        // TODO: Handle invitation to group (an invitation is sent to you by another user)
    }

    @Override
    public void onChatGroupUserAddedMessage(UserAddedMessage userAddedMessage) {
        // TODO: A user is added to a group you are member of, handle it here
    }

    @Override
    public void onChatGroupUserJoinedMessage(UserJoinedMessage userJoinedMessage) {
        // TODO: A user has joined to a group you are member of, handle it here
    }

    @Override
    public void onChatGroupUserLeftMessage(UserLeftMessage userLeftMessage) {
        // TODO: A user left a group you are member of, handle it here
    }

    @Override
    public void onChatGroupUserRemovedMessage(UserRemovedMessage userRemovedMessage) {
        // TODO: A user is removed from a group you are member of, handle it here
    }
    /*********** End Chat Listener *************/

    /*********** Start Realtime Sdk Listener *************/
    @Override
    public void onDisconnect() {}
    @Override
    public void onException(ExceptionMessage exceptionMessage) {}
    /*********** End Realtime Sdk Listener *************/
}

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

دریافت چت از کاربران دیگر

برای آنکه پیام‌های چتی که از کاربران دیگر، مستقیما برای کاربر شما ارسال می‌شود، را دریافت کنید، باید تابع onChatMessage از Listener چت را پیاده‌سازی کنید و پیام دریافتی را به هر صورت که تمایل دارید نمایش دهید:

@Override
public void onChatMessage(SimpleChatMessage simpleChatMessage) {
    Log.d("TAG", "Sent from: " + simpleChatMessage.getSenderId());
    Log.d("TAG", "Message: " + simpleChatMessage.getMessage());
}

همانطور که دیده می‌شود، با سادگی می‌توانید بفهمید چه پیامی از چه کسی به دست شما رسیده است.

دریافت پیام پوش

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

@Override
public void onPushMessage(SimpleChatMessage pushMessage) {
    // Do nothing here
}

دریافت یک پوش BULK

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

@Override
public void onGroupPushMessage(SimpleChatMessage groupPushMessage) {
    // Do nothing here
}

دریافت پیام در یک گروه دیگر

در صورتی که در یکی از گروه‌های تحت عضویت کاربر فعلی اپ شما، پیامی داده شود، شما می‌توانید با پیاده‌سازی Listener چت به کمک تابع OnGroupChatMessage پیام را دریافت کرده و به نحوه مناسب در گروه مورد نظر به کاربر نمایش دهید‍:

@Override
public void OnGroupChatMessage(SimpleChatMessage groupChatMessage) {
        Log.d("TAG", "Group: " + groupChatMessage.getGroupId());
        Log.d("TAG", "Sent from: " + groupChatMessage.getSenderId());
        Log.d("TAG", "Message: " + groupChatMessage.getMessage());
}

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

دریافت یک Invitation عضویت

در صورتی که برای کاربر فعلی شما (CurrentUser) یک درخواست عضویت در گروه دیگر (Invitation) توسط Owner آن گروه ارسال شود، کاربر شما به کمک تابع زیر از Listener چت درخواست را دریافت خواهد کرد و می‌تواند به کمک سرویس عضویت در گروه‌های دیگر در آن سرویس عضو شود.

@Override
public void onChatInvitationMessage(ChatInvitationMessage chatInvitationMessage) {
    Log.d("TAG", "You are invited to group: " + chatInvitationMessage.getGroupName());
    Log.d("TAG", "Id of group is: " + chatInvitationMessage.getGroupId());
    Log.d("TAG", "You are invited by: " + chatInvitationMessage.getCallerId());
}

دریافت اضافه شدن کاربر به گروه

در صورتی که عضو گروهی باشید و کاربری به آن اضافه شود، شما از طریق Listener چت و تابع onChatGroupUserAddedMessage خبردار خواهید شد. دقت کنید که این کاربر می‌توانید خود شما باشید، یعنی وقتی شما به یک گروه اضافه شوید، پیام به خود شما هم خواهد آمد. به این ترتیب اگر چندین دستگاه داشته باشید و روی یکی از آنها خود را به گروه اضافه کنید، بقیه دستگاه‌ها هم خبردار خواهند شد.

@Override
public void onChatGroupUserAddedMessage(UserAddedMessage userAddedMessage) {
    Log.d("TAG", userAddedMessage.getAdderUserId() + " has added "
            + userAddedMessage.getAddedUserId() + " to group "
            + userAddedMessage.getGroupId());
});

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

دریافت Join شدن کاربر به گروه

زمانی که در یکی از گروه‌های تحت عضویت کاربر موبایل شما، یک کاربر دیگر Join شود، SDK از طریق Listener چت و تابع onChatGroupUserJoinedMessage به شما خبر خواهد داد. در کد زیر می‌توانید فیلدهایی که در این پیام به شما داده می‌شود را ببینید:

@Override
public void onChatGroupUserJoinedMessage(UserJoinedMessage userJoinedMessage) {
    Log.d("TAG", "Group is: " + userJoinedMessage.getGroupId());
    Log.d("TAG", "User is: " + userJoinedMessage.getUserId());
}

همانطور که می‌بینید شناسه گروه و شناسه کاربر در اختیار شما قرار گرفته است.

دریافت ترک گروه توسط یک کاربر

وقتی عضو یک گروه هستید و کاربری آن گروه را ترک می‌کند، شما از طریق Listener چت و تابع OnChatGroupUserLeftMessage از این اتفاق خبردار خواهید شد.

@Override
public void onChatGroupUserLeftMessage(UserLeftMessage userLeftMessage) {
    Log.d("TAG", "Group is: " + userLeftMessage.getGroupId());
    Log.d("TAG", "User is: " + userLeftMessage.getUserId());
}

همانطور که می‌بینید شناسه گروه و شناسه کاربر در اختیار شما قرار گرفته است.

دریافت حذف یک کاربر از گروه

برخلاف ترک یک کاربر که کاربر به اختیار گروه را ترک می‌کند، گاهی Owner تصمیم می‌گیرد که کاربری را از گروه اخراج کند، به این عمل Remove گفته می‌شود. وقتی در یکی از گروه‌هایی که کاربر موبایل شما عضو است، کاربری Remove شود، پیامی برای همه اعضای گروه از جمله کاربر شما ارسال خواهد شد. این پیام از طریق Listener چت و تابع onChatGroupUserRemovedMessage در اختیار شما قرار خواهد گرفت:

@Override
public void onChatGroupUserRemovedMessage(UserRemovedMessage userRemovedMessage) {
    Log.d("TAG", userRemovedMessage.getRemovedUserId() + " is removed.");
    Log.d("TAG", "He/she is removed by: " + userRemovedMessage.getRemoverUserId());
    Log.d("TAG", "This has happened in group: " + userRemovedMessage.getGroupId());
}

همانطور که می‌بینید، کاربری که حذف‌کننده است، کاربری که حذف شده و گروه به شما داده شده است.

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

گام بعدی