async def make_match_room(match: Match, register=False) -> MatchRoom or None: """Create a discord.Channel and a corresponding MatchRoom for the given Match. Parameters ---------- match: Match The Match to create a room for. register: bool If True, will register the Match in the database. Returns ------- Optional[MatchRoom] The created room object. """ # Check to see the match is registered if not match.is_registered: if register: await match.commit() else: console.warning('Tried to make a MatchRoom for an unregistered Match ({0}).'.format(match.matchroom_name)) return None # Check to see if we already have the match channel channel_id = match.channel_id match_channel = server.find_channel(channel_id=channel_id) if channel_id is not None else None # If we couldn't find the channel or it didn't exist, make a new one if match_channel is None: # Create permissions deny_read = discord.PermissionOverwrite(read_messages=False) permit_read = discord.PermissionOverwrite(read_messages=True) racer_permissions = [] for racer in match.racers: if racer.member is not None: racer_permissions.append(discord.ChannelPermissions(target=racer.member, overwrite=permit_read)) # Make a channel for the room # noinspection PyUnresolvedReferences match_channel = await server.client.create_channel( server.server, get_matchroom_name(match), discord.ChannelPermissions(target=server.server.default_role, overwrite=deny_read), discord.ChannelPermissions(target=server.server.me, overwrite=permit_read), *racer_permissions, type=discord.ChannelType.text) if match_channel is None: console.warning('Failed to make a match channel.') return None # Make the actual RaceRoom and initialize it match.set_channel_id(int(match_channel.id)) new_room = MatchRoom(match_discord_channel=match_channel, match=match) Necrobot().register_bot_channel(match_channel, new_room) await new_room.initialize() return new_room
async def close_match_room(match: Match) -> None: """Close the discord.Channel corresponding to the Match, if any. Parameters ---------- match: Match The Match to close the channel for. """ if not match.is_registered: console.warning('Trying to close the room for an unregistered match.') return channel_id = match.channel_id channel = server.find_channel(channel_id=channel_id) if channel is None: console.warning('Coudn\'t find channel with id {0} in close_match_room ' '(match_id={1}).'.format(channel_id, match.match_id)) return await Necrobot().unregister_bot_channel(channel) await server.client.delete_channel(channel) match.set_channel_id(None)
async def make_match_room(match: Match, register=False) -> MatchRoom or None: """Create a discord.Channel and a corresponding MatchRoom for the given Match. Parameters ---------- match: Match The Match to create a room for. register: bool If True, will register the Match in the database. Returns ------- Optional[MatchRoom] The created room object. """ # Check to see the match is registered if not match.is_registered: if register: await match.commit() else: console.warning( 'Tried to make a MatchRoom for an unregistered Match ({0}).'. format(match.matchroom_name)) return None # Check to see if we already have the match channel channel_id = match.channel_id match_channel = server.find_channel( channel_id=channel_id) if channel_id is not None else None # If we couldn't find the channel or it didn't exist, make a new one if match_channel is None: # Create permissions deny_read = discord.PermissionOverwrite(read_messages=False) permit_read = discord.PermissionOverwrite(read_messages=True) racer_permissions = {server.guild.default_role: deny_read} for racer in match.racers: if racer.member is not None: racer_permissions[racer.member] = permit_read # Find the matches category channel channel_categories = MatchGlobals( ).channel_categories # type: List[discord.CategoryChannel] if channel_categories is None: category_name = Config.MATCH_CHANNEL_CATEGORY_NAME if len(category_name) > 0: channel_category = await server.create_channel_category( category_name) MatchGlobals().set_channel_categories([channel_category]) # Attempt to create the channel in each of the categories in reverse order if channel_categories is not None: success = False for channel_category in reversed(channel_categories): try: match_channel = await server.guild.create_text_channel( name=get_matchroom_name(match), overwrites=racer_permissions, category=channel_category) success = True break except discord.HTTPException: pass # If we still haven't made the channel, we're out of space, so register a new matches category if not success: new_channel_category = await server.create_channel_category( name=Config.MATCH_CHANNEL_CATEGORY_NAME) MatchGlobals().add_channel_category( channel=new_channel_category) match_channel = await server.guild.create_text_channel( name=get_matchroom_name(match), overwrites=racer_permissions, category=new_channel_category) # If we don't have or want a category channel, just make the match without a category else: match_channel = await server.guild.create_text_channel( name=get_matchroom_name(match), overwrites=racer_permissions) if match_channel is None: console.warning('Failed to make a match channel.') return None # Make the actual RaceRoom and initialize it match.set_channel_id(int(match_channel.id)) new_room = MatchRoom(match_discord_channel=match_channel, match=match) Necrobot().register_bot_channel(match_channel, new_room) await new_room.initialize() return new_room