def test_handle_categorize_channel(self): name = "puzzle" channel = Channel(id=22222, type=ChannelType.GUILD_VOICE, name=name) self.mock_client.guilds_channels_create.return_value = channel unassigned_voice_category = Channel( id=33333, type=ChannelType.GUILD_CATEGORY, name=DISCORD_VOICE_CATEGORY, ) meta_category = Channel( id=44444, type=ChannelType.GUILD_CATEGORY, name="meta", ) self.mock_client.guilds_channels_list.return_value = { unassigned_voice_category.id: unassigned_voice_category, meta_category.id: meta_category, } self.assertEqual( self.service.create_audio_channel(DISCORD_GUILD_ID, name, DISCORD_VOICE_CATEGORY), channel.id, ) self.service.categorize_channel(DISCORD_GUILD_ID, channel.id, "meta") self.mock_client.channels_modify.assert_has_calls([ mock.call(channel.id, parent_id=meta_category.id), ])
def test_archive_and_unarchive_channel(self): name = "channel-name" channel = Channel(id=22222, type=ChannelType.GUILD_VOICE, name=name) self.mock_client.guilds_channels_create.return_value = channel self.assertEqual( self.service.create_audio_channel(DISCORD_GUILD_ID, name), channel.id) archived = Channel( id=33333, type=ChannelType.GUILD_CATEGORY, name=DISCORD_ARCHIVE_CATEGORY, ) self.mock_client.guilds_channels_list.return_value = { archived.id: archived } self.service.archive_channel(DISCORD_GUILD_ID, channel.id, DISCORD_ARCHIVE_CATEGORY) parent = Channel( id=44444, type=ChannelType.GUILD_CATEGORY, name=DISCORD_TEXT_CATEGORY, ) self.mock_client.guilds_channels_list.return_value = { parent.id: parent } self.service.unarchive_text_channel(DISCORD_GUILD_ID, channel.id, DISCORD_TEXT_CATEGORY) self.mock_client.channels_modify.assert_has_calls([ mock.call(channel.id, parent_id=archived.id), mock.call(channel.id, parent_id=parent.id), ])
def test_deprecated_nsfw_channel(): channel = Channel(name='nsfw-testing', type=ChannelType.GUILD_TEXT) assert channel.is_nsfw channel = Channel(name='nsfw-testing', type=ChannelType.GUILD_VOICE) assert not channel.is_nsfw channel = Channel(name='nsfw_testing', type=ChannelType.GUILD_TEXT) assert not channel.is_nsfw
def test_nsfw_channel(self): channel = Channel(name='nsfw-testing', type=ChannelType.GUILD_TEXT) self.assertTrue(channel.is_nsfw) channel = Channel(name='nsfw-testing', type=ChannelType.GUILD_VOICE) self.assertFalse(channel.is_nsfw) channel = Channel(name='nsfw_testing', type=ChannelType.GUILD_TEXT) self.assertFalse(channel.is_nsfw)
def test_create_audio_channel_creates_parent_category(self): parent = Channel( id=22222, type=ChannelType.GUILD_CATEGORY, name=DISCORD_TEXT_CATEGORY, ) self.mock_client.guilds_channels_create.return_value = parent name = "channel-name" self.service.create_audio_channel(DISCORD_GUILD_ID, name, DISCORD_VOICE_CATEGORY) self.mock_client.guilds_channels_create.assert_has_calls([ # Create parent category channel first. mock.call( DISCORD_GUILD_ID, ChannelType.GUILD_CATEGORY, DISCORD_VOICE_CATEGORY, parent_id=None, ), # Create voice channel under category created above. mock.call( DISCORD_GUILD_ID, ChannelType.GUILD_VOICE, name, parent_id=parent.id, ), ])
def guilds_channels_create(self, guild, name, channel_type, bitrate=None, user_limit=None, permission_overwrites=[], parent_id=None, reason=None): payload = { 'name': name, 'channel_type': channel_type, 'permission_overwrites': [i.to_dict() for i in permission_overwrites], 'parent_id': parent_id, } if channel_type == 'text': pass elif channel_type == 'voice': if bitrate is not None: payload['bitrate'] = bitrate if user_limit is not None: payload['user_limit'] = user_limit else: # TODO: better error here? raise Exception('Invalid channel type: {}'.format(channel_type)) r = self.http( Routes.GUILDS_CHANNELS_CREATE, dict(guild=guild), json=payload, headers=_reason_header(reason)) return Channel.create(self.client, r.json(), guild_id=guild)
def channels_modify(self, channel, reason=None, **kwargs): r = self.http( Routes.CHANNELS_MODIFY, dict(channel=channel), json=kwargs, headers=_reason_header(reason)) return Channel.create(self.client, r.json())
def guilds_channels_create( self, guild, channel_type, name, bitrate=None, user_limit=None, permission_overwrites=[], nsfw=None, parent_id=None, position=None, reason=None): payload = { 'name': name, 'type': channel_type.value if isinstance(channel_type, EnumAttr) else channel_type, 'permission_overwrites': [i.to_dict() for i in permission_overwrites], 'parent_id': parent_id, } payload.update(optional( nsfw=nsfw, bitrate=bitrate, user_limit=user_limit, position=position, )) r = self.http( Routes.GUILDS_CHANNELS_CREATE, dict(guild=guild), json=payload, headers=_reason_header(reason)) return Channel.create(self.client, r.json(), guild_id=guild)
def test_create_text_channel_creates_parent_category(self): parent = Channel( id=22222, type=ChannelType.GUILD_CATEGORY, name=FakeDjangoSettings.DISCORD_PUZZLE_CATEGORY, ) self.mock_client.guilds_channels_create.return_value = parent name = "channel-name" self.service.create_text_channel(name) self.mock_client.guilds_channels_create.assert_has_calls( [ # Create parent category channel first. mock.call( FakeDjangoSettings.DISCORD_GUILD_ID, ChannelType.GUILD_CATEGORY, FakeDjangoSettings.DISCORD_PUZZLE_CATEGORY, parent_id=None, ), # Create text channel under category created above. mock.call( FakeDjangoSettings.DISCORD_GUILD_ID, ChannelType.GUILD_TEXT, name, parent_id=parent.id, ), ] )
def test_handle_puzzle_rename(self): name = "channel-name" channel = Channel(id=22222, type=ChannelType.GUILD_TEXT, name=name) new_name = "channel-new-name" self.service.handle_puzzle_rename(channel.id, new_name) self.mock_client.channels_modify.assert_called_once_with(channel.id, name=new_name)
def test_delete_audio_channel(self): name = "channel-name" channel = Channel(id=22222, type=ChannelType.GUILD_VOICE, name=name) self.mock_client.guilds_channels_create.return_value = channel self.assertEqual(self.service.create_audio_channel(name), channel.id) self.mock_client.guilds_channels_list.return_value = {channel.id: channel} self.service.delete_audio_channel(channel.id) self.mock_client.channels_delete.assert_called_once_with(channel.id)
def test_archive_channel_category_full(self): puzzles = Channel( id=33332, type=ChannelType.GUILD_CATEGORY, name=FakeDjangoSettings.DISCORD_PUZZLE_CATEGORY, ) archive = Channel( id=33333, type=ChannelType.GUILD_CATEGORY, name=FakeDjangoSettings.DISCORD_ARCHIVE_CATEGORY, ) channels_list = {archive.id: archive, puzzles.id: puzzles} # Make archive full. for i in range(MAX_CHANNELS_PER_CATEGORY): channels_list[archive.id + i + 1] = Channel( id=archive.id + i + 1, type=ChannelType.GUILD_TEXT, name="child", parent_id=archive.id, ) # Create channel with no parent. channel1 = Channel(id=22222, type=ChannelType.GUILD_VOICE, name="channel1") # The next channel archived should create a new archive. new_archive = Channel( id=44444, type=ChannelType.GUILD_CATEGORY, name=FakeDjangoSettings.DISCORD_ARCHIVE_CATEGORY, ) self.mock_client.guilds_channels_list.return_value = channels_list self.mock_client.guilds_channels_create.return_value = new_archive self.service.archive_channel(channel1.id) self.mock_client.guilds_channels_create.assert_called_once_with( FakeDjangoSettings.DISCORD_GUILD_ID, ChannelType.GUILD_CATEGORY, FakeDjangoSettings.DISCORD_ARCHIVE_CATEGORY, parent_id=None, ) # Unarchive to make archive not full. channels_list[new_archive.id] = new_archive self.mock_client.guilds_channels_list.return_value = channels_list self.service.unarchive_channel(archive.id + 1) # Archive another channel. This should go inside the first archive. channels_list.pop(archive.id + 1) self.mock_client.guilds_channels_list.return_value = channels_list channel2 = Channel(id=22223, type=ChannelType.GUILD_VOICE, name="channel2") self.service.archive_channel(channel2.id) self.mock_client.channels_modify.assert_has_calls( [ mock.call(channel1.id, parent_id=new_archive.id), mock.call(archive.id + 1, parent_id=puzzles.id), mock.call(channel2.id, parent_id=archive.id), ] )
def test_create_text_channel_with_existing_parent_category(self): parent = Channel( id=22222, type=ChannelType.GUILD_CATEGORY, name=FakeDjangoSettings.DISCORD_PUZZLE_CATEGORY, ) self.mock_client.guilds_channels_list.return_value = {parent.id: parent} name = "channel-name" self.service.create_text_channel(name) # Skip creating the category and just create the text channel. self.mock_client.guilds_channels_create.assert_called_once_with( FakeDjangoSettings.DISCORD_GUILD_ID, ChannelType.GUILD_TEXT, name, parent_id=parent.id, )
def test_create_audio_channel_with_existing_parent_category(self): parent = Channel( id=22222, type=ChannelType.GUILD_CATEGORY, name=DISCORD_VOICE_CATEGORY, ) self.mock_client.guilds_channels_list.return_value = { parent.id: parent } name = "channel-name" self.service.create_audio_channel(DISCORD_GUILD_ID, name, DISCORD_VOICE_CATEGORY) # Skip creating the category and just create the voice channel. self.mock_client.guilds_channels_create.assert_called_once_with( DISCORD_GUILD_ID, ChannelType.GUILD_VOICE, name, parent_id=parent.id, )
def channels_get(self, channel): r = self.http(Routes.CHANNELS_GET, dict(channel=channel)) return Channel.create(self.client, r.json())
def guilds_channels_create(self, guild, **kwargs): r = self.http(Routes.GUILDS_CHANNELS_CREATE, dict(guild=guild), json=kwargs) return Channel.create(self.client, r.json(), guild_id=guild)
def guilds_channels_list(self, guild): r = self.http(Routes.GUILDS_CHANNELS_LIST, dict(guild=guild)) return Channel.create_map(self.client, r.json(), guild_id=guild)
def users_me_dms_create(self, recipient_id): r = self.http(Routes.USERS_ME_DMS_CREATE, json={ 'recipient_id': recipient_id, }) return Channel.create(self.client, r.json())
def channels_delete(self, channel, reason=None): r = self.http( Routes.CHANNELS_DELETE, dict(channel=channel), headers=_reason_header(reason)) return Channel.create(self.client, r.json())
def test_nsfw_channel(): channel = Channel(name='test', nsfw=True, type=ChannelType.GUILD_TEXT) assert channel.is_nsfw
def channels_modify(self, channel, **kwargs): r = self.http(Routes.CHANNELS_MODIFY, dict(channel=channel), json=kwargs) return Channel.create(self.client, r.json())
def channels_delete(self, channel): r = self.http(Routes.CHANNELS_DELETE, dict(channel=channel)) return Channel.create(self.client, r.json())
def test_create_channel_category_full(self): parent1 = Channel( id=22222, type=ChannelType.GUILD_CATEGORY, name=DISCORD_TEXT_CATEGORY, ) parent2 = Channel( id=33333, type=ChannelType.GUILD_CATEGORY, name=DISCORD_TEXT_CATEGORY, ) channels_list = {parent1.id: parent1, parent2.id: parent2} # Make parent1 full. for i in range(MAX_CHANNELS_PER_CATEGORY): channels_list[parent1.id + i + 1] = Channel( id=parent1.id + i + 1, type=ChannelType.GUILD_TEXT, name="child", parent_id=parent1.id, ) # The next channel created should go under parent2. self.mock_client.guilds_channels_list.return_value = channels_list self.service.create_text_channel(DISCORD_GUILD_ID, "new", DISCORD_TEXT_CATEGORY) self.mock_client.guilds_channels_create.assert_called_once_with( DISCORD_GUILD_ID, ChannelType.GUILD_TEXT, "new", parent_id=parent2.id, ) # Make parent2 full. for i in range(MAX_CHANNELS_PER_CATEGORY): channels_list[parent2.id + i + 1] = Channel( id=parent2.id + i + 1, type=ChannelType.GUILD_TEXT, name="child", parent_id=parent2.id, ) # The next channel created should create a new parent. self.mock_client.guilds_channels_list.return_value = channels_list new_parent = Channel( id=44444, type=ChannelType.GUILD_CATEGORY, name=DISCORD_TEXT_CATEGORY, ) self.mock_client.guilds_channels_create.return_value = new_parent self.service.create_text_channel(DISCORD_GUILD_ID, "new", DISCORD_TEXT_CATEGORY) self.mock_client.guilds_channels_create.assert_has_calls([ # Create parent category channel first. mock.call( DISCORD_GUILD_ID, ChannelType.GUILD_CATEGORY, DISCORD_TEXT_CATEGORY, parent_id=None, ), # Create text channel under category created above. mock.call( DISCORD_GUILD_ID, ChannelType.GUILD_TEXT, "new", parent_id=44444, ), ])