コード例 #1
0
    async def test_request_guild_members_when_shard_previously_tracked_with_optionals(
            self, mock_chunker, mock_app, guild):
        mock_chunker._tracked[0] = {"randomNonce": object()}

        with mock.patch.object(stateful_guild_chunker,
                               "_random_nonce",
                               return_value="AvEryCrYpToGraPhIcNoNcE"):
            result = await mock_chunker.request_guild_members(
                guild,
                include_presences=True,
                limit=53,
                query="Kiss",
                users=[snowflakes.Snowflake(1235432)])

            stateful_guild_chunker._random_nonce.assert_called_once()

        assert result == "0.AvEryCrYpToGraPhIcNoNcE"
        assert len(mock_chunker._tracked[0]) == 2
        assert mock_chunker._tracked[0][
            "0.AvEryCrYpToGraPhIcNoNcE"].guild_id == snowflakes.Snowflake(
                43123)
        assert mock_chunker._tracked[0][
            "0.AvEryCrYpToGraPhIcNoNcE"].nonce == "0.AvEryCrYpToGraPhIcNoNcE"
        mock_app.shards[0].request_guild_members.assert_awaited_once_with(
            guild=snowflakes.Snowflake(43123),
            include_presences=True,
            limit=53,
            nonce="0.AvEryCrYpToGraPhIcNoNcE",
            query="Kiss",
            users=[snowflakes.Snowflake(1235432)],
        )
コード例 #2
0
    async def test_request_guild_members_when_shard_not_previously_tracked_without_optionals(
            self, mock_chunker, mock_app):
        mock_app.shards[2].intents = intents.Intents.GUILD_MESSAGES

        with mock.patch.object(stateful_guild_chunker,
                               "_random_nonce",
                               return_value="NonceNonceNonceNonce"):
            result = await mock_chunker.request_guild_members(
                745181921625243730, )

            stateful_guild_chunker._random_nonce.assert_called_once()

        assert result == "2.NonceNonceNonceNonce"
        assert len(mock_chunker._tracked[2]) == 1
        assert mock_chunker._tracked[2][
            "2.NonceNonceNonceNonce"].guild_id == snowflakes.Snowflake(
                745181921625243730)
        assert mock_chunker._tracked[2][
            "2.NonceNonceNonceNonce"].nonce == "2.NonceNonceNonceNonce"
        mock_app.shards[2].request_guild_members.assert_awaited_once_with(
            guild=snowflakes.Snowflake(745181921625243730),
            include_presences=False,
            limit=0,
            nonce="2.NonceNonceNonceNonce",
            query="",
            users=undefined.UNDEFINED,
        )
コード例 #3
0
 async def test_list_chunk_statuses_for_guild_for_known_shard(
         self, mock_chunker):
     mock_tracked_info_0 = mock.MagicMock(
         stateful_guild_chunker._TrackedRequests,
         guild_id=snowflakes.Snowflake(379953393319542784))
     mock_tracked_info_1 = mock.MagicMock(
         stateful_guild_chunker._TrackedRequests,
         guild_id=snowflakes.Snowflake(379953393319542784))
     mock_chunker._tracked = {
         0: {
             "0.owowo":
             mock_tracked_info_0,
             "0.game":
             mock.Mock(stateful_guild_chunker._TrackedRequests,
                       guild_id=snowflakes.Snowflake(45123)),
             "0.blam":
             mock_tracked_info_1,
             "0.pow":
             mock.Mock(stateful_guild_chunker._TrackedRequests,
                       guild_id=snowflakes.Snowflake(53123)),
         }
     }
     result = await mock_chunker.list_requests_for_guild(379953393319542784)
     assert result == (mock_tracked_info_0, mock_tracked_info_1)
     assert result[0] is not mock_tracked_info_0
     assert result[1] is not mock_tracked_info_1
コード例 #4
0
    async def test_open_for_inactive_stream(self, mock_app):
        stream = hikari_test_helpers.stub_class(
            stateful_guild_chunker.ChunkStream,
            _active=False,
            _app=mock_app,
            _guild_id=snowflakes.Snowflake(35412312312),
            _event_type=shard_events.MemberChunkEvent,
            _include_presences=True,
            _query="a query",
            _limit=42,
            _users=[snowflakes.Snowflake(431223), 54234],
            _nonce="AnOnCe",
        )

        with mock.patch.object(event_stream.EventStream,
                               "open") as patched_super:
            assert await stream.open() is None

            patched_super.assert_called_once()

        mock_app.shards[2].request_guild_members.assert_awaited_once_with(
            guild=snowflakes.Snowflake(35412312312),
            include_presences=True,
            query="a query",
            limit=42,
            users=[snowflakes.Snowflake(431223), 54234],
            nonce="AnOnCe",
        )
コード例 #5
0
    def deserialize_message_delete_bulk_event(
            self, shard: gateway_shard.GatewayShard,
            payload: data_binding.JSONObject
    ) -> message_events.MessageDeleteEvent:

        message_ids = collections.SnowflakeSet(
            *(snowflakes.Snowflake(message_id)
              for message_id in payload["ids"]))
        channel_id = snowflakes.Snowflake(payload["channel_id"])

        if "guild_id" in payload:
            return message_events.GuildMessageDeleteEvent(
                app=self._app,
                shard=shard,
                channel_id=channel_id,
                guild_id=snowflakes.Snowflake(payload["guild_id"]),
                message_ids=message_ids,
                is_bulk=True,
            )

        return message_events.DMMessageDeleteEvent(app=self._app,
                                                   shard=shard,
                                                   channel_id=channel_id,
                                                   message_ids=message_ids,
                                                   is_bulk=True)
コード例 #6
0
    def deserialize_message_delete_event(
        self,
        shard: gateway_shard.GatewayShard,
        payload: data_binding.JSONObject,
        *,
        old_message: typing.Optional[messages_models.Message],
    ) -> message_events.MessageDeleteEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        message_id = snowflakes.Snowflake(payload["id"])

        if "guild_id" in payload:
            return message_events.GuildMessageDeleteEvent(
                app=self._app,
                shard=shard,
                channel_id=channel_id,
                message_id=message_id,
                guild_id=snowflakes.Snowflake(payload["guild_id"]),
                old_message=old_message,
            )

        return message_events.DMMessageDeleteEvent(
            app=self._app,
            shard=shard,
            channel_id=channel_id,
            message_id=message_id,
            old_message=old_message,
        )
コード例 #7
0
ファイル: test_emojis.py プロジェクト: Reliku/hikari
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
コード例 #8
0
ファイル: event_factory.py プロジェクト: Reliku/hikari
    def deserialize_message_reaction_remove_emoji_event(
        self, shard: gateway_shard.GatewayShard,
        payload: data_binding.JSONObject
    ) -> reaction_events.ReactionDeleteEmojiEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        message_id = snowflakes.Snowflake(payload["message_id"])
        emoji = self._app.entity_factory.deserialize_emoji(payload["emoji"])

        if "guild_id" in payload:
            return reaction_events.GuildReactionDeleteEmojiEvent(
                app=self._app,
                shard=shard,
                emoji=emoji,
                guild_id=snowflakes.Snowflake(payload["guild_id"]),
                channel_id=channel_id,
                message_id=message_id,
            )

        # TODO: check if this can even occur.
        return reaction_events.DMReactionDeleteEmojiEvent(
            app=self._app,
            shard=shard,
            emoji=emoji,
            channel_id=channel_id,
            message_id=message_id,
        )
コード例 #9
0
    def deserialize_message_reaction_remove_emoji_event(
        self, shard: gateway_shard.GatewayShard,
        payload: data_binding.JSONObject
    ) -> reaction_events.ReactionDeleteEmojiEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        message_id = snowflakes.Snowflake(payload["message_id"])
        emoji_id, emoji_name = self._split_reaction_emoji(payload["emoji"])

        if "guild_id" in payload:
            return reaction_events.GuildReactionDeleteEmojiEvent(
                app=self._app,
                shard=shard,
                emoji_id=emoji_id,
                emoji_name=emoji_name,
                guild_id=snowflakes.Snowflake(payload["guild_id"]),
                channel_id=channel_id,
                message_id=message_id,
            )

        return reaction_events.DMReactionDeleteEmojiEvent(
            app=self._app,
            shard=shard,
            emoji_id=emoji_id,
            emoji_name=emoji_name,
            channel_id=channel_id,
            message_id=message_id,
        )
コード例 #10
0
ファイル: event_factory.py プロジェクト: Reliku/hikari
    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 = self._app.entity_factory.deserialize_emoji(payload["emoji"])

        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(
                app=self._app,
                shard=shard,
                member=member,
                channel_id=channel_id,
                message_id=message_id,
                emoji=emoji,
            )

        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=emoji,
        )
コード例 #11
0
ファイル: event_factory.py プロジェクト: Reliku/hikari
    def deserialize_typing_start_event(
            self, shard: gateway_shard.GatewayShard,
            payload: data_binding.JSONObject) -> typing_events.TypingEvent:
        channel_id = snowflakes.Snowflake(payload["channel_id"])
        user_id = snowflakes.Snowflake(payload["user_id"])
        # Turns out that this endpoint uses seconds rather than milliseconds.
        timestamp = time.unix_epoch_to_datetime(payload["timestamp"],
                                                is_millis=False)

        if "guild_id" in payload:
            guild_id = snowflakes.Snowflake(payload["guild_id"])
            member = self._app.entity_factory.deserialize_member(
                payload["member"], guild_id=guild_id)
            return typing_events.GuildTypingEvent(
                app=self._app,
                shard=shard,
                channel_id=channel_id,
                guild_id=guild_id,
                timestamp=timestamp,
                user=member,
            )

        return typing_events.DMTypingEvent(app=self._app,
                                           shard=shard,
                                           channel_id=channel_id,
                                           user_id=user_id,
                                           timestamp=timestamp)
コード例 #12
0
ファイル: test_channels.py プロジェクト: ahnaf-zamil/hikari
    def test_get_channel_when_no_cache_trait(self):
        follow = channels.ChannelFollow(
            webhook_id=snowflakes.Snowflake(993883),
            app=object(),
            channel_id=snowflakes.Snowflake(696969))

        assert follow.get_channel() is None
コード例 #13
0
def message():
    return messages.Message(
        app=None,
        id=snowflakes.Snowflake(1234),
        channel_id=snowflakes.Snowflake(5678),
        guild_id=snowflakes.Snowflake(910112),
        author=mock.Mock(spec_set=users.User),
        member=mock.Mock(spec_set=guilds.Member),
        content="blahblahblah",
        timestamp=datetime.datetime.now().astimezone(),
        edited_timestamp=None,
        is_tts=False,
        mentions=messages.Mentions(
            message=mock.Mock(),
            users={},
            role_ids=[],
            channels={},
            everyone=False,
        ),
        attachments=(),
        embeds=(),
        reactions=(),
        is_pinned=True,
        webhook_id=None,
        type=messages.MessageType.DEFAULT,
        activity=None,
        application=None,
        message_reference=None,
        flags=None,
        nonce=None,
        referenced_message=None,
        stickers=[],
    )
コード例 #14
0
ファイル: test_guilds.py プロジェクト: zeroday0619/hikari
 def model(self, mock_app):
     return hikari_test_helpers.mock_class_namespace(guilds.Guild)(
         app=mock_app,
         id=snowflakes.Snowflake(123),
         splash_hash="splash_hash",
         discovery_splash_hash="discovery_splash_hash",
         banner_hash="banner_hash",
         icon_hash="icon_hash",
         features=[guilds.GuildFeature.ANIMATED_ICON],
         name="some guild",
         application_id=snowflakes.Snowflake(9876),
         afk_channel_id=snowflakes.Snowflake(1234),
         afk_timeout=datetime.timedelta(seconds=60),
         default_message_notifications=guilds.
         GuildMessageNotificationsLevel.ONLY_MENTIONS,
         description=None,
         explicit_content_filter=guilds.GuildExplicitContentFilterLevel.
         ALL_MEMBERS,
         is_widget_enabled=False,
         max_video_channel_users=10,
         mfa_level=guilds.GuildMFALevel.NONE,
         owner_id=snowflakes.Snowflake(1111),
         preferred_locale="en-GB",
         premium_subscription_count=12,
         premium_tier=guilds.GuildPremiumTier.TIER_3,
         public_updates_channel_id=None,
         region="london",
         rules_channel_id=None,
         system_channel_id=None,
         vanity_url_code="yeet",
         verification_level=guilds.GuildVerificationLevel.VERY_HIGH,
         widget_channel_id=None,
         system_channel_flags=guilds.GuildSystemChannelFlag.
         SUPPRESS_PREMIUM_SUBSCRIPTION,
     )
コード例 #15
0
    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 = self._app.entity_factory.deserialize_emoji(payload["emoji"])

        if "guild_id" in payload:
            return reaction_events.GuildReactionDeleteEvent(
                app=self._app,
                shard=shard,
                user_id=user_id,
                guild_id=snowflakes.Snowflake(payload["guild_id"]),
                channel_id=channel_id,
                message_id=message_id,
                emoji=emoji,
            )

        return reaction_events.PrivateReactionDeleteEvent(
            app=self._app,
            shard=shard,
            user_id=user_id,
            channel_id=channel_id,
            message_id=message_id,
            emoji=emoji,
        )
コード例 #16
0
ファイル: test_message_events.py プロジェクト: tomxey/hikari
 def event(self):
     return message_events.GuildMessageBulkDeleteEvent(
         guild_id=snowflakes.Snowflake(542342354564),
         channel_id=snowflakes.Snowflake(54213123123),
         app=mock.Mock(),
         shard=None,
         message_ids=None,
     )
コード例 #17
0
ファイル: test_presences.py プロジェクト: ahnaf-zamil/hikari
 def model(self, mock_app):
     return presences.MemberPresence(
         app=mock_app,
         user_id=snowflakes.Snowflake(432),
         guild_id=snowflakes.Snowflake(234),
         visible_status=presences.Status.ONLINE,
         activities=mock.Mock(presences.RichActivity),
         client_status=mock.Mock(presences.ClientStatus),
     )
コード例 #18
0
 def event(self):
     return message_events.GuildMessageDeleteEvent(
         guild_id=snowflakes.Snowflake(542342354564),
         channel_id=snowflakes.Snowflake(54213123123),
         app=mock.Mock(),
         shard=object(),
         message_id=9,
         old_message=object(),
     )
コード例 #19
0
 def event(self):
     return message_events.GuildMessageCreateEvent(
         message=mock.Mock(
             spec_set=messages.Message,
             guild_id=snowflakes.Snowflake(342123123),
             channel_id=snowflakes.Snowflake(9121234),
         ),
         shard=mock.Mock(),
     )
コード例 #20
0
 def event(self):
     cls = hikari_test_helpers.mock_class_namespace(
         channel_events.GuildChannelEvent,
         guild_id=mock.PropertyMock(
             return_value=snowflakes.Snowflake(929292929)),
         channel_id=mock.PropertyMock(
             return_value=snowflakes.Snowflake(432432432)),
     )
     return cls()
コード例 #21
0
ファイル: event_factory.py プロジェクト: Reliku/hikari
 def deserialize_guild_role_delete_event(
         self, shard: gateway_shard.GatewayShard,
         payload: data_binding.JSONObject) -> role_events.RoleDeleteEvent:
     return role_events.RoleDeleteEvent(
         app=self._app,
         shard=shard,
         guild_id=snowflakes.Snowflake(payload["guild_id"]),
         role_id=snowflakes.Snowflake(payload["role_id"]),
     )
コード例 #22
0
 def model(self, mock_app):
     return channels.DMChannel(
         id=snowflakes.Snowflake(12345),
         name="steve",
         type=channels.ChannelType.DM,
         last_message_id=snowflakes.Snowflake(12345),
         recipient=mock.Mock(spec_set=users.UserImpl, __str__=mock.Mock(return_value="snoop#0420")),
         app=mock_app,
     )
コード例 #23
0
ファイル: test_message_events.py プロジェクト: tomxey/hikari
 def event(self):
     cls = hikari_test_helpers.mock_class_namespace(
         message_events.GuildMessageEvent,
         guild_id=mock.PropertyMock(
             return_value=snowflakes.Snowflake(342123123)),
         channel_id=mock.PropertyMock(
             return_value=snowflakes.Snowflake(54123123123)),
     )
     return cls()
コード例 #24
0
 def event(self):
     return message_events.GuildMessageDeleteEvent(
         guild_id=snowflakes.Snowflake(542342354564),
         channel_id=snowflakes.Snowflake(54213123123),
         app=mock.Mock(),
         shard=mock.Mock(),
         message_ids={9, 18, 27, 36},
         is_bulk=True,
     )
コード例 #25
0
 def event(self):
     return message_events.GuildMessageUpdateEvent(
         app=mock.Mock(),
         message=mock.Mock(
             spec_set=messages.Message,
             guild_id=snowflakes.Snowflake(54123123123),
             channel_id=snowflakes.Snowflake(800001066),
         ),
         shard=mock.Mock(),
     )
コード例 #26
0
ファイル: emojis.py プロジェクト: ashwinvin/hikari
    def parse(cls, string: str, /) -> CustomEmoji:
        if string.isdigit():
            return CustomEmoji(id=snowflakes.Snowflake(string), name=None, is_animated=None)

        if emoji_match := _CUSTOM_EMOJI_REGEX.match(string):
            return CustomEmoji(
                id=snowflakes.Snowflake(emoji_match.group("id")),
                name=emoji_match.group("name"),
                is_animated=emoji_match.group("flags").lower() == "a",
            )
コード例 #27
0
ファイル: event_manager.py プロジェクト: ashwinvin/hikari
    async def on_guild_member_remove(self, shard: gateway_shard.GatewayShard, payload: data_binding.JSONObject) -> None:
        """See https://discord.com/developers/docs/topics/gateway#guild-member-remove for more info."""
        old: typing.Optional[guilds.Member] = None
        if self._cache:
            old = self._cache.delete_member(
                snowflakes.Snowflake(payload["guild_id"]), snowflakes.Snowflake(payload["user"]["id"])
            )

        event = self._event_factory.deserialize_guild_member_remove_event(shard, payload, old_member=old)
        await self.dispatch(event)
コード例 #28
0
    async def test_fetch_webhook(self, mock_app):
        mock_app.rest.fetch_webhook = mock.AsyncMock(return_value=mock.Mock(webhooks.ChannelFollowerWebhook))
        follow = channels.ChannelFollow(
            webhook_id=snowflakes.Snowflake(54123123), app=mock_app, channel_id=snowflakes.Snowflake(94949494)
        )

        result = await follow.fetch_webhook()

        assert result is mock_app.rest.fetch_webhook.return_value
        mock_app.rest.fetch_webhook.assert_awaited_once_with(54123123)
コード例 #29
0
class TestCustomEmoji:
    @pytest.fixture()
    def emoji(self):
        return emojis.CustomEmoji(id=3213452, name="ok", is_animated=False)

    def test_filename_property(self, emoji):
        assert emoji.filename == "3213452.png"

    def test_filename_property_when_animated(self, emoji):
        emoji.is_animated = True
        assert emoji.filename == "3213452.gif"

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

    def test_mention_property(self, emoji):
        assert emoji.mention == "<:ok:3213452>"

    def test_mention_property_when_animated(self, emoji):
        emoji.is_animated = True

        assert emoji.mention == "<a:ok:3213452>"

    def test_url_property(self, emoji):
        assert emoji.url == "https://cdn.discordapp.com/emojis/3213452.png"

    def test_str_operator_when_populated_name(self):
        emoji = emojis.CustomEmoji(id=snowflakes.Snowflake(12345),
                                   name="peepoSad",
                                   is_animated=True)
        assert str(emoji) == emoji.mention

    @pytest.mark.parametrize(
        ("input", "output"),
        [
            ("<: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)),
        ],
    )
    def test_parse(self, input, output):
        assert emojis.CustomEmoji.parse(input) == output

    def test_parse_unhappy_path(self):
        with pytest.raises(ValueError, match="Expected an emoji mention"):
            emojis.CustomEmoji.parse("xxx")
コード例 #30
0
ファイル: event_factory.py プロジェクト: zeroday0619/hikari
 def deserialize_webhook_update_event(
     self, shard: gateway_shard.GatewayShard, payload: data_binding.JSONObject
 ) -> channel_events.WebhookUpdateEvent:
     guild_id = snowflakes.Snowflake(payload["guild_id"])
     channel_id = snowflakes.Snowflake(payload["channel_id"])
     return channel_events.WebhookUpdateEvent(
         app=self._app,
         shard=shard,
         channel_id=channel_id,
         guild_id=guild_id,
     )