Repository: line/line-bot-sdk-python

Issue:
Emoji is not supported by linebot.models.TextSendMessage
I want to use LINE emoji in Text message (https://developers.line.biz/en/reference/messaging-api/#text-message), but current linebot.models.TextSendMessage does not support emojis.

## System Informations

* Python version: 3.8.5
* SDK version: 1.17.0
* OS: macOS 10.15.7

## Expected Behavior
linebot.models.TextSendMessage() accepts emojis parameter

## Current Behavior
linebot.models.TextSendMessage() ignores emojis parameter

## Steps to  Reproduce
```python
>>> import linebot.models
>>> emoji = {"index": 0, "productId": "5ac1bfd5040ab15980c9b435", "emojiId": "001"}
>>> m = linebot.models.TextSendMessage(text="$foo", emojis=[emoji])
>>> print(m)
{"text": "$foo", "type": "text"}
```

I think this can be achieved easily with change linebot.models.TextSendMessage like this:

```python
class TextSendMessage(SendMessage):
    """TextSendMessage.
    https://developers.line.biz/en/reference/messaging-api/#text-message
    """

    def __init__(self, text=None, emojis=None, quick_reply=None, **kwargs):
        """__init__ method.
        :param str text: Message text
        :param List emojis: Array of LINE emoji objects
        :param quick_reply: QuickReply object
        :type quick_reply: T <= :py:class:`linebot.models.send_messages.QuickReply`
        :param kwargs:
        """
        super(TextSendMessage, self).__init__(quick_reply=quick_reply, **kwargs)

        self.type = 'text'
        self.text = text

        # ADD BELOW LINES
        if emojis:
            new_emojis = []
            for emoji in emojis:
                emoji_object = self.get_or_new_from_json_dict(
                    emoji, Emojis
                )
                if emoji_object:
                    new_emojis.append(emoji_object)
            self.emojis = new_emojis
        self.emojis = emojis
```

Discussion:

Patch:
diff --git a/linebot/api.py b/linebot/api.py
index 9565c61..8bc5df0 100644
--- a/linebot/api.py
+++ b/linebot/api.py
@@ -30,7 +30,7 @@ from .models import (
     InsightMessageEventResponse, BroadcastResponse, NarrowcastResponse,
     MessageProgressNarrowcastResponse, BotInfo, GetWebhookResponse, TestWebhookResponse,
 )
-from .models.responses import Group
+from .models.responses import Group, UserIds
 
 
 class LineBotApi(object):
@@ -1218,6 +1218,29 @@ class LineBotApi(object):
 
         return TestWebhookResponse.new_from_json_dict(response.json)
 
+    def get_followers_ids(self, start=None, timeout=None):
+        """Get a list of users who added your LINE Official Account as a friend.
+
+        https://developers.line.biz/en/reference/messaging-api/#get-follower-ids
+
+        :param str start: Get the next array of user IDs.
+        :param timeout: (optional) How long to wait for the server
+            to send data before giving up, as a float,
+            or a (connect timeout, read timeout) float tuple.
+            Default is self.http_client.timeout
+        :type timeout: float | tuple(float, float)
+        :rtype: :py:class:`linebot.models.responses.UserIds`
+        """
+        params = None if start is None else {'start': start}
+
+        response = self._get(
+            '/v2/bot/followers/ids',
+            params=params,
+            timeout=timeout
+        )
+
+        return UserIds.new_from_json_dict(response.json)
+
     def _get(self, path, endpoint=None, params=None, headers=None, stream=False, timeout=None):
         url = (endpoint or self.endpoint) + path
 
diff --git a/linebot/models/__init__.py b/linebot/models/__init__.py
index be0140e..9f7bc0a 100644
--- a/linebot/models/__init__.py
+++ b/linebot/models/__init__.py
@@ -200,3 +200,7 @@ from .background import (  # noqa
     Background,
     LinearGradientBackground,
 )
+
+from .emojis import (  # noqa
+    Emojis
+)
diff --git a/linebot/models/messages.py b/linebot/models/messages.py
index fc51975..9709481 100644
--- a/linebot/models/messages.py
+++ b/linebot/models/messages.py
@@ -54,7 +54,7 @@ class TextMessage(Message):
 
         :param str id: Message ID
         :param str text: Message text
-        :param List sticon: Array of LINE emoji objects
+        :param List emojis: Array of LINE emoji objects
         :param object mention: LINE mention object
         :param kwargs:
         """
diff --git a/linebot/models/responses.py b/linebot/models/responses.py
index f6d0d4c..7593daa 100644
--- a/linebot/models/responses.py
+++ b/linebot/models/responses.py
@@ -572,3 +572,26 @@ class TestWebhookResponse(Base):
         self.status_code = status_code
         self.reason = reason
         self.detail = detail
+
+
+class UserIds(Base):
+    """UserIds.
+
+    https://developers.line.biz/en/reference/messaging-api/#get-follower-ids
+    """
+
+    def __init__(self, user_ids=None, next=None, **kwargs):
+        """__init__ method.
+
+        :param user_ids: List of user IDs of users
+            that have added the LINE Official Account as a friend.
+            Max: 300 user IDs
+        :type user_ids: list[str]
+        :param str next: continuationToken.
+            A continuation token to get the next array of user IDs.
+        :param kwargs:
+        """
+        super(UserIds, self).__init__(**kwargs)
+
+        self.user_ids = user_ids
+        self.next = next
diff --git a/linebot/models/send_messages.py b/linebot/models/send_messages.py
index dc9c534..eed26bf 100644
--- a/linebot/models/send_messages.py
+++ b/linebot/models/send_messages.py
@@ -20,6 +20,7 @@ from abc import ABCMeta
 
 from future.utils import with_metaclass
 
+from .emojis import Emojis
 from .actions import get_action
 from .base import Base
 
@@ -49,7 +50,7 @@ class TextSendMessage(SendMessage):
     https://developers.line.biz/en/reference/messaging-api/#text-message
     """
 
-    def __init__(self, text=None, quick_reply=None, **kwargs):
+    def __init__(self, text=None, emojis=None, quick_reply=None, **kwargs):
         """__init__ method.
 
         :param str text: Message text
@@ -61,6 +62,17 @@ class TextSendMessage(SendMessage):
 
         self.type = 'text'
         self.text = text
+        if emojis:
+            new_emojis = []
+            for emoji in emojis:
+                emoji_object = self.get_or_new_from_json_dict(
+                    emoji, Emojis
+                )
+                if emoji_object:
+                    new_emojis.append(emoji_object)
+            self.emojis = new_emojis
+        else:
+            self.emojis = emojis
 
 
 class ImageSendMessage(SendMessage):


Test patch:
diff --git a/tests/api/test_get_member_ids.py b/tests/api/test_get_member_ids.py
index 938cd99..e0d2654 100644
--- a/tests/api/test_get_member_ids.py
+++ b/tests/api/test_get_member_ids.py
@@ -117,6 +117,50 @@ class TestLineBotApi(unittest.TestCase):
         self.assertEqual(member_ids_response.member_ids, ['U1', 'U2'])
         self.assertEqual(member_ids_response.next, 'continuationToken2')
 
+    @responses.activate
+    def test_get_follower_user_ids(self):
+        responses.add(
+            responses.GET,
+            LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/followers/ids',
+            json={
+                'userIds': ['U1', 'U2']
+            },
+            status=200
+        )
+
+        member_ids_response = self.tested.get_followers_ids()
+
+        request = responses.calls[0].request
+        self.assertEqual(request.method, 'GET')
+        self.assertEqual(
+            request.url,
+            LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/followers/ids')
+        self.assertEqual(member_ids_response.user_ids, ['U1', 'U2'])
+        self.assertEqual(member_ids_response.next, None)
+
+    @responses.activate
+    def test_get_follower_user_ids_with_start(self):
+        responses.add(
+            responses.GET,
+            LineBotApi.DEFAULT_API_ENDPOINT + '/v2/bot/followers/ids',
+            json={
+                'userIds': ['U1', 'U2'],
+                'next': 'continuationToken2'
+            },
+            status=200
+        )
+
+        member_ids_response = self.tested.get_followers_ids(start='continuationToken1')
+
+        request = responses.calls[0].request
+        self.assertEqual(request.method, 'GET')
+        self.assertEqual(
+            request.url,
+            LineBotApi.DEFAULT_API_ENDPOINT +
+            '/v2/bot/followers/ids?start=continuationToken1')
+        self.assertEqual(member_ids_response.user_ids, ['U1', 'U2'])
+        self.assertEqual(member_ids_response.next, 'continuationToken2')
+
 
 if __name__ == '__main__':
     unittest.main()