Exemple #1
0
class TestEmoji:
    @pytest.mark.parametrize(
        ("input", "output"),
        [
            ("12345",
             emojis.CustomEmoji(
                 id=snowflakes.Snowflake(12345), name=None, is_animated=None)),
            ("<:foo:12345>",
             emojis.CustomEmoji(id=snowflakes.Snowflake(12345),
                                name="foo",
                                is_animated=False)),
            ("<bar:foo:12345>",
             emojis.CustomEmoji(id=snowflakes.Snowflake(12345),
                                name="foo",
                                is_animated=False)),
            ("<a:foo:12345>",
             emojis.CustomEmoji(id=snowflakes.Snowflake(12345),
                                name="foo",
                                is_animated=True)),
            ("\N{OK HAND SIGN}", emojis.UnicodeEmoji(name="\N{OK HAND SIGN}")),
            (
                "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}",
                emojis.UnicodeEmoji(
                    name=
                    "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}"
                ),
            ),
        ],
    )
    def test_parse(self, input, output):
        assert emojis.Emoji.parse(input) == output
Exemple #2
0
class TestReactionDeleteEmojiEvent:
    def test_is_for_emoji_when_custom_emoji_matches(self):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEmojiEvent, emoji_id=332223333)()

        assert event.is_for_emoji(
            emojis.CustomEmoji(id=332223333, name=None, is_animated=True))

    def test_is_for_emoji_when_unicode_emoji_matches(self):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEmojiEvent, emoji_name="🌲e")()

        assert event.is_for_emoji(emojis.UnicodeEmoji("🌲e"))

    @pytest.mark.parametrize(
        ("emoji_id", "emoji_name", "emoji"),
        [
            (None, "heeei",
             emojis.CustomEmoji(name=None, id=541123, is_animated=False)),
            (1233211, None, emojis.UnicodeEmoji("no eeeu")),
        ],
    )
    def test_is_for_emoji_when_wrong_emoji_type(self, emoji_id, emoji_name,
                                                emoji):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEmojiEvent,
            emoji_id=emoji_id,
            emoji_name=emoji_name)()

        assert event.is_for_emoji(emoji) is False

    @pytest.mark.parametrize(
        ("emoji_id", "emoji_name", "emoji"),
        [
            (None, "dsahi", emojis.UnicodeEmoji("bye321")),
            (12331231, None,
             emojis.CustomEmoji(id=121233312123, name=None,
                                is_animated=False)),
        ],
    )
    def test_is_for_emoji_when_emoji_miss_match(self, emoji_id, emoji_name,
                                                emoji):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEmojiEvent,
            emoji_id=emoji_id,
            emoji_name=emoji_name)()

        assert event.is_for_emoji(emoji) is False
Exemple #3
0
    def build_entity(self, _: traits.RESTAware, /) -> presences.RichActivity:
        emoji: typing.Optional[emojis.Emoji] = None
        if isinstance(self.emoji, RefCell):
            emoji = self.emoji.copy()

        elif self.emoji is not None:
            emoji = emojis.UnicodeEmoji(self.emoji)

        return presences.RichActivity(
            name=self.name,
            url=self.url,
            type=self.type,
            created_at=self.created_at,
            application_id=self.application_id,
            details=self.details,
            is_instance=self.is_instance,
            flags=self.flags,
            state=self.state,
            timestamps=copy.copy(self.timestamps) if self.timestamps is not None else None,
            party=copy.copy(self.party) if self.party is not None else None,
            assets=copy.copy(self.assets) if self.assets is not None else None,
            secrets=copy.copy(self.secrets) if self.secrets is not None else None,
            emoji=emoji,
            buttons=self.buttons,
        )
Exemple #4
0
class TestReactionDeleteEvent:
    def test_is_for_emoji_when_custom_emoji_matches(self):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEvent, emoji_id=333)()

        assert event.is_for_emoji(
            emojis.CustomEmoji(id=333, name=None, is_animated=True))

    def test_is_for_emoji_when_unicode_emoji_matches(self):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEvent, emoji_name="e")()

        assert event.is_for_emoji(emojis.UnicodeEmoji("e"))

    @pytest.mark.parametrize(
        ("emoji_id", "emoji_name", "emoji"),
        [
            (None, "hasdi",
             emojis.CustomEmoji(name=None, id=3123, is_animated=False)),
            (534123, None, emojis.UnicodeEmoji("nodfgdu")),
        ],
    )
    def test_is_for_emoji_when_wrong_emoji_type(self, emoji_id, emoji_name,
                                                emoji):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEvent,
            emoji_id=emoji_id,
            emoji_name=emoji_name)()

        assert event.is_for_emoji(emoji) is False

    @pytest.mark.parametrize(
        ("emoji_id", "emoji_name", "emoji"),
        [
            (None, "hfdasi", emojis.UnicodeEmoji("bgye")),
            (54123, None,
             emojis.CustomEmoji(id=34123, name=None, is_animated=False)),
        ],
    )
    def test_is_for_emoji_when_emoji_miss_match(self, emoji_id, emoji_name,
                                                emoji):
        event = hikari_test_helpers.mock_class_namespace(
            reaction_events.ReactionDeleteEvent,
            emoji_id=emoji_id,
            emoji_name=emoji_name)()

        assert event.is_for_emoji(emoji) is False
Exemple #5
0
class TestUnicodeEmoji:
    def test_str_operator(self):
        assert emojis.UnicodeEmoji(
            name="\N{OK HAND SIGN}") == "\N{OK HAND SIGN}"

    @pytest.mark.parametrize(
        ("input", "output"),
        [
            ("\N{OK HAND SIGN}", emojis.UnicodeEmoji(name="\N{OK HAND SIGN}")),
            (
                "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}",
                emojis.UnicodeEmoji(
                    name=
                    "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}"
                ),
            ),
        ],
    )
    def test_parse(self, input, output):
        assert emojis.UnicodeEmoji.parse(input) == output
Exemple #6
0
    def deserialize_message_reaction_add_event(
            self, shard: gateway_shard.GatewayShard,
            payload: data_binding.JSONObject
    ) -> reaction_events.ReactionAddEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        message_id = snowflakes.Snowflake(payload["message_id"])

        emoji_payload = payload["emoji"]
        raw_emoji_id = emoji_payload.get("id")
        emoji_id = snowflakes.Snowflake(raw_emoji_id) if raw_emoji_id else None
        is_animated = bool(emoji_payload.get("animated", False))
        emoji_name = emojis_models.UnicodeEmoji(
            emoji_payload["name"]) if not emoji_id else emoji_payload["name"]

        if "member" in payload:
            guild_id = snowflakes.Snowflake(payload["guild_id"])
            member = self._app.entity_factory.deserialize_member(
                payload["member"], guild_id=guild_id)
            return reaction_events.GuildReactionAddEvent(
                shard=shard,
                member=member,
                channel_id=channel_id,
                message_id=message_id,
                emoji_id=emoji_id,
                emoji_name=emoji_name,
                is_animated=is_animated,
            )

        user_id = snowflakes.Snowflake(payload["user_id"])
        return reaction_events.DMReactionAddEvent(
            app=self._app,
            shard=shard,
            channel_id=channel_id,
            message_id=message_id,
            user_id=user_id,
            emoji_id=emoji_id,
            emoji_name=emoji_name,
            is_animated=is_animated,
        )
Exemple #7
0
 def test_str_operator(self):
     assert emojis.UnicodeEmoji(
         name="\N{OK HAND SIGN}") == "\N{OK HAND SIGN}"
Exemple #8
0
 def test_str_operator(self):
     reaction = messages.Reaction(
         emoji=emojis.UnicodeEmoji("\N{OK HAND SIGN}"),
         count=42,
         is_me=True)
     assert str(reaction) == "\N{OK HAND SIGN}"
Exemple #9
0
            channel_id=channel_id,
            message_id=message_id,
            user_id=user_id,
            emoji_id=emoji_id,
            emoji_name=emoji_name,
            is_animated=is_animated,
        )

    def _split_reaction_emoji(
        self, emoji_payload: data_binding.JSONObject, /
    ) -> typing.Tuple[typing.Optional[snowflakes.Snowflake], typing.Union[
            str, emojis_models.UnicodeEmoji, None]]:
        if (emoji_id := emoji_payload.get("id")) is not None:
            return snowflakes.Snowflake(emoji_id), emoji_payload["name"]

        return None, emojis_models.UnicodeEmoji(emoji_payload["name"])

    def deserialize_message_reaction_remove_event(
        self, shard: gateway_shard.GatewayShard,
        payload: data_binding.JSONObject
    ) -> reaction_events.ReactionDeleteEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        message_id = snowflakes.Snowflake(payload["message_id"])
        user_id = snowflakes.Snowflake(payload["user_id"])
        emoji_id, emoji_name = self._split_reaction_emoji(payload["emoji"])

        if "guild_id" in payload:
            return reaction_events.GuildReactionDeleteEvent(
                app=self._app,
                shard=shard,
                user_id=user_id,
Exemple #10
0
class Test_SelectOptionBuilder:
    @pytest.fixture()
    def option(self):
        return special_endpoints._SelectOptionBuilder(menu=mock.Mock(),
                                                      label="ok",
                                                      value="ok2")

    def test_label_property(self, option):
        assert option.label == "ok"

    def test_value_property(self, option):
        assert option.value == "ok2"

    def test_emoji_property(self, option):
        option._emoji = 123321
        assert option.emoji == 123321

    def test_set_description(self, option):
        assert option.set_description("a desk") is option
        assert option.description == "a desk"

    @pytest.mark.parametrize(
        "emoji", ["unicode", emojis.UnicodeEmoji("unicode")])
    def test_set_emoji_with_unicode_emoji(self, option, emoji):
        result = option.set_emoji(emoji)

        assert result is option
        assert option._emoji == emoji
        assert option._emoji_id is undefined.UNDEFINED
        assert option._emoji_name == "unicode"

    @pytest.mark.parametrize("emoji", [
        emojis.CustomEmoji(name="ok", id=34123123, is_animated=False), 34123123
    ])
    def test_set_emoji_with_custom_emoji(self, option, emoji):
        result = option.set_emoji(emoji)

        assert result is option
        assert option._emoji == emoji
        assert option._emoji_id == "34123123"
        assert option._emoji_name is undefined.UNDEFINED

    def test_set_emoji_with_undefined(self, option):
        result = option.set_emoji(undefined.UNDEFINED)

        assert result is option
        assert option._emoji_id is undefined.UNDEFINED
        assert option._emoji_name is undefined.UNDEFINED
        assert option._emoji is undefined.UNDEFINED

    def test_set_is_default(self, option):
        assert option.set_is_default(True) is option
        assert option.is_default is True

    def test_add_to_menu(self, option):
        assert option.add_to_menu() is option._menu
        option._menu.add_raw_option.assert_called_once_with(option)

    def test_build_with_custom_emoji(self, option):
        result = (special_endpoints._SelectOptionBuilder(
            label="ok", value="ok2", menu=object()).set_is_default(
                True).set_emoji(123312).set_description("very").build())

        assert result == {
            "label": "ok",
            "value": "ok2",
            "default": True,
            "emoji": {
                "id": "123312"
            },
            "description": "very",
        }

    def test_build_with_unicode_emoji(self, option):
        result = (special_endpoints._SelectOptionBuilder(
            label="ok", value="ok2", menu=object()).set_is_default(
                True).set_emoji("hi").set_description("very").build())

        assert result == {
            "label": "ok",
            "value": "ok2",
            "default": True,
            "emoji": {
                "name": "hi"
            },
            "description": "very",
        }

    def test_build_partial(self, option):
        result = special_endpoints._SelectOptionBuilder(label="ok",
                                                        value="ok2",
                                                        menu=object()).build()

        assert result == {"label": "ok", "value": "ok2", "default": False}
Exemple #11
0
class Test_ButtonBuilder:
    @pytest.fixture()
    def button(self):
        return special_endpoints._ButtonBuilder(
            container=mock.Mock(),
            style=messages.ButtonStyle.DANGER,
            custom_id="sfdasdasd",
            url="hi there",
            emoji=543123,
            emoji_id="56554456",
            emoji_name="hi there",
            label="a lebel",
            is_disabled=True,
        )

    def test_style_property(self, button):
        assert button.style is messages.ButtonStyle.DANGER

    def test_emoji_property(self, button):
        assert button.emoji == 543123

    @pytest.mark.parametrize(
        "emoji", ["unicode", emojis.UnicodeEmoji("unicode")])
    def test_set_emoji_with_unicode_emoji(self, button, emoji):
        result = button.set_emoji(emoji)

        assert result is button
        assert button._emoji == emoji
        assert button._emoji_id is undefined.UNDEFINED
        assert button._emoji_name == "unicode"

    @pytest.mark.parametrize("emoji", [
        emojis.CustomEmoji(name="ok", id=34123123, is_animated=False), 34123123
    ])
    def test_set_emoji_with_custom_emoji(self, button, emoji):
        result = button.set_emoji(emoji)

        assert result is button
        assert button._emoji == emoji
        assert button._emoji_id == "34123123"
        assert button._emoji_name is undefined.UNDEFINED

    def test_set_emoji_with_undefined(self, button):
        result = button.set_emoji(undefined.UNDEFINED)

        assert result is button
        assert button._emoji_id is undefined.UNDEFINED
        assert button._emoji_name is undefined.UNDEFINED
        assert button._emoji is undefined.UNDEFINED

    def test_set_label(self, button):
        assert button.set_label("hi hi") is button
        assert button.label == "hi hi"

    def test_set_is_disabled(self, button):
        assert button.set_is_disabled(False)
        assert button.is_disabled is False

    def test_build(self):
        result = special_endpoints._ButtonBuilder(
            container=object(),
            style=messages.ButtonStyle.DANGER,
            url=undefined.UNDEFINED,
            emoji_id=undefined.UNDEFINED,
            emoji_name="emoji_name",
            label="no u",
            custom_id="ooga booga",
            is_disabled=True,
        ).build()

        assert result == {
            "type": messages.ComponentType.BUTTON,
            "style": messages.ButtonStyle.DANGER,
            "emoji": {
                "name": "emoji_name"
            },
            "label": "no u",
            "custom_id": "ooga booga",
            "disabled": True,
        }

    def test_build_without_optional_fields(self):
        result = special_endpoints._ButtonBuilder(
            container=object(),
            style=messages.ButtonStyle.LINK,
            url="OK",
            emoji_id="123321",
            emoji_name=undefined.UNDEFINED,
            label=undefined.UNDEFINED,
            custom_id=undefined.UNDEFINED,
            is_disabled=False,
        ).build()

        assert result == {
            "type": messages.ComponentType.BUTTON,
            "style": messages.ButtonStyle.LINK,
            "emoji": {
                "id": "123321"
            },
            "disabled": False,
            "url": "OK",
        }

    def test_add_to_container(self):
        mock_container = mock.Mock()
        button = special_endpoints._ButtonBuilder(
            container=mock_container,
            style=messages.ButtonStyle.DANGER,
            url=undefined.UNDEFINED,
            emoji_id=undefined.UNDEFINED,
            emoji_name="emoji_name",
            label="no u",
            custom_id="ooga booga",
            is_disabled=True,
        )

        assert button.add_to_container() is mock_container

        mock_container.add_component.assert_called_once_with(button)
Exemple #12
0
            "id": "3412312",
        }

    def test_build_without_optional_data(self):
        builder = special_endpoints.CommandBuilder("we are numberr", "oner")

        result = builder.build(mock.Mock())

        assert result == {
            "name": "we are numberr",
            "description": "oner",
            "options": []
        }


@pytest.mark.parametrize("emoji", ["UNICORN", emojis.UnicodeEmoji("UNICORN")])
def test__build_emoji_with_unicode_emoji(emoji):
    result = special_endpoints._build_emoji(emoji)

    assert result == (undefined.UNDEFINED, "UNICORN")


@pytest.mark.parametrize("emoji", [
    snowflakes.Snowflake(54123123), 54123123,
    emojis.CustomEmoji(id=54123123, name=None, is_animated=None)
])
def test__build_emoji_with_custom_emoji(emoji):
    result = special_endpoints._build_emoji(emoji)

    assert result == ("54123123", undefined.UNDEFINED)
    def test_is_for_emoji_when_unicode_emoji_matches(self):
        event = hikari_test_helpers.mock_class_namespace(reaction_events.ReactionDeleteEvent, emoji_name="e")()

        assert event.is_for_emoji(emojis.UnicodeEmoji("e"))
Exemple #14
0
from hikari import traits
from hikari import undefined
from hikari.events import lifetime_events
from hikari.events import reaction_events

from yuyo import backoff

if typing.TYPE_CHECKING:
    from hikari import channels
    from hikari import messages
    from hikari import users
    from hikari.api import event_manager


LEFT_DOUBLE_TRIANGLE: typing.Final[emojis.UnicodeEmoji] = emojis.UnicodeEmoji(
    "\N{BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR}\N{VARIATION SELECTOR-16}"
)
"""The emoji used to go back to the first entry."""
LEFT_TRIANGLE: typing.Final[emojis.UnicodeEmoji] = emojis.UnicodeEmoji(
    "\N{BLACK LEFT-POINTING TRIANGLE}\N{VARIATION SELECTOR-16}"
)
"""The emoji used to go back an entry."""
STOP_SQUARE: typing.Final[emojis.UnicodeEmoji] = emojis.UnicodeEmoji(
    "\N{BLACK SQUARE FOR STOP}\N{VARIATION SELECTOR-16}"
)
"""The emoji used to close a menu."""
RIGHT_TRIANGLE: typing.Final[emojis.UnicodeEmoji] = emojis.UnicodeEmoji(
    "\N{BLACK RIGHT-POINTING TRIANGLE}\N{VARIATION SELECTOR-16}"
)
"""The emoji used to continue to the next entry."""
RIGHT_DOUBLE_TRIANGLE: typing.Final[emojis.UnicodeEmoji] = emojis.UnicodeEmoji(
Exemple #15
0
 def emoji(self):
     return emojis.UnicodeEmoji("\N{OK HAND SIGN}")
Exemple #16
0
class TestUnicodeEmoji:
    @pytest.fixture()
    def emoji(self):
        return emojis.UnicodeEmoji("\N{OK HAND SIGN}")

    def test_name_property(self, emoji):
        assert emoji.name == emoji

    def test_url_name_property(self, emoji):
        assert emoji.url_name == emoji

    def test_mention_property(self, emoji):
        assert emoji.mention == emoji

    def test_codepoints_property(self, emoji):
        assert emoji.codepoints == [128076]

    @pytest.mark.parametrize(
        ("codepoints", "expected_filename"),
        [
            # Normal tests
            ([0x1F44C], "1f44c"),
            ([0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C], "1f44c-1f44c-1f44c-1f44c"),
            # Outliers tests
            # 1. Second codepoint is not 0xFE0F => Nothing
            ([0xFE0F, 0x1F44C], "fe0f-1f44c"),
            # 2. More than 4 codepoints => Nothing
            ([0x1F44C, 0xFE0F, 0x1F44C, 0x1F44C, 0x1F44C
              ], "1f44c-fe0f-1f44c-1f44c-1f44c"),
            # 3. Third codepoint is 0x200D => Nothing
            ([0x1F44C, 0xFE0F, 0x200D], "1f44c-fe0f-200d"),
            # 4. None of above apply => Remove second codepoint
            ([0x200D, 0xFE0F, 0x1F44C, 0x1F44C], "200d-1f44c-1f44c"),
        ],
    )
    def test_filename_property(self, codepoints, expected_filename):
        emoji = emojis.UnicodeEmoji.parse_codepoints(*codepoints)
        assert emoji.filename == f"{expected_filename}.png"

    def test_url_property(self, emoji):
        assert emoji.url == "https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/1f44c.png"

    def test_unicode_escape_property(self, emoji):
        assert emoji.unicode_escape == "\\U0001f44c"

    def test_parse_codepoints(self, emoji):
        assert emojis.UnicodeEmoji.parse_codepoints(128076) == emoji

    def test_parse_unicode_escape(self, emoji):
        assert emojis.UnicodeEmoji.parse_unicode_escape("\\U0001f44c") == emoji

    def test_str_operator(self, emoji):
        assert str(emoji) == emoji

    @pytest.mark.parametrize(
        ("input", "output"),
        [
            ("\N{OK HAND SIGN}", emojis.UnicodeEmoji("\N{OK HAND SIGN}")),
            (
                "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}",
                emojis.UnicodeEmoji(
                    "\N{REGIONAL INDICATOR SYMBOL LETTER G}\N{REGIONAL INDICATOR SYMBOL LETTER B}"
                ),
            ),
        ],
    )
    def test_parse(self, input, output):
        assert emojis.UnicodeEmoji.parse(input) == output