async def get_overwrite(self, channel: discord.Channel = None, role_or_user=None, permission=None): # The channel variable is optional simply because I'm too lazy to care # And because it was the easiest way to get this working in the intended way if channel is None or role_or_user is None: return None if permission is None: return channel.overwrites_for(role_or_user) # return discord.utils.find(lambda perm: perm == permission, channel.overwrites_for(role_or_user)) for perm, overwrite in channel.overwrites_for(role_or_user): if perm == permission: return overwrite
async def _update_overwrites(self, channel: discord.Channel, *, unlock: bool = False): # Assuming the default role is always position 0. role = channel.server.default_role overwrite = channel.overwrites_for(role) overwrite.send_messages = None if unlock else False await self.bot.edit_channel_permissions(channel, role, overwrite)
async def copyrole(self, ctx, role: discord.Role, src_channel: discord.Channel, *, des_channels): """Copy role permission from a channel to channels""" perms = src_channel.overwrites_for(role) converter = commands.ChannelConverter for c in des_channels.split(): try: ch = converter(ctx, c).convert() except commands.errors.BadArgument as e: await self.bot.say(e) continue await self.bot.edit_channel_permissions(ch, role, overwrite=perms) await self.bot.say("Changed permissions successfully")
async def suspend(message: discord.Message, channel: discord.Channel=Annotate.Self): """ Suspends a channel by removing send permission for the server's default role. This function acts like a toggle. """ send = channel.overwrites_for(message.server.default_role).send_messages print(send, False if send is None else not send) overwrite = discord.PermissionOverwrite(send_messages=False if send is None else not send) await client.edit_channel_permissions(channel, message.server.default_role, overwrite) try: if overwrite.send_messages: await client.say(message, "{} is no longer suspended.".format(channel.mention)) else: await client.say(message, "Suspended {}.".format(channel.mention)) except discord.Forbidden: # ... await client.send_message(message.author, "You just removed my send permission in {}.".format(channel.mention))
async def _leave_channel(self, ctx, hidden_channel: discord.Channel): """ 退室を行います。 隠れチャンネル#devを退室する例「!ch leave dev」 DMから利用不可。 """ message = ctx.message member = message.author permission = hidden_channel.permissions_for(member) visible = permission.read_messages overwrite = hidden_channel.overwrites_for(member) if visible and not overwrite.is_empty(): await self.bot.delete_channel_permissions(hidden_channel, member) await self.bot.say("{0.name}を退室しました。".format(hidden_channel), delete_after=10) else: raise commands.BadArgument
async def _join_channel(self, ctx, hidden_channel: discord.Channel): """ 入室を行います。 隠れチャンネル#devへ入室する例「!ch join dev」 DMから利用不可。 """ message = ctx.message member = message.author my_permission = hidden_channel.permissions_for(member) my_overwrite = hidden_channel.overwrites_for(member) visible = my_permission.read_messages if not visible and my_overwrite.is_empty(): # 隠れch("everyoneのみ"不可視指定) -> overwriteで可視化 if all([r.is_everyone for r in hidden_channel.changed_roles]): await self.bot.edit_channel_permissions( hidden_channel, member, VISIBLE_OVERWRITE) await self.bot.say("{0.name}に入室しました。".format(hidden_channel), delete_after=10) return # 役職限定ch(everyone不可視、特定の役職可視) -> 不正入力扱い else: raise commands.BadArgument #隠れチャンネルではない又は入室済み await self.bot.say("このチャンネルには入室済みです。", delete_after=10)
def _is_hidden(channel: discord.Channel): everyone_overwrite = channel.overwrites_for(channel.server.default_role) visible = everyone_overwrite.read_messages if visible is None: return False return not visible