async def set_genders(self, ctx, *roles: typing.Union[discord.Role, str]): s = ctx.message.author.guild if len(roles) == 0: r1 = await s.create_role(name='♂', colour=discord.Colour.blue(), mentionable=True) r2 = await s.create_role(name='♀', colour=discord.Colour(16711893), mentionable=True) d = data_read(ctx.guild) d['genders'] = [r1.id, r2.id] data_write(ctx.guild, d) elif len(roles) == 2: if isinstance(roles[0], discord.Role): d = data_read(ctx.guild) d['genders'] = [roles[0].id, roles[1].id] data_write(ctx.guild, d) else: r1 = await s.create_role(name=roles[0], colour=discord.Colour.blue(), mentionable=True) r2 = await s.create_role(name=roles[1], colour=discord.Colour(16711893), mentionable=True) d = data_read(ctx.guild) d['genders'] = [r1.id, r2.id] data_write(ctx.guild, d) else: raise errors.BadArgument
async def channels_(self, ctx, *chans: discord.TextChannel): await ctx.message.delete() if not chans: d = data_read(ctx.guild) d['channels'] = [] data_write(ctx.guild, d) await ctx.send('Теперь можно писать команды в любом чате :hugging:', delete_after=20) return d = data_read(ctx.guild) d['channels'] = [chan.id for chan in chans] data_write(ctx.guild, d) await ctx.send(f'Эт{wordend(len(chans), "от", "и", "и")} {len(chans)} канал{wordend(len(chans), "", "а", "ов")}' f' успешно установлен{wordend(len(chans), "", "ы", "ы")} как разрешённые :thumbsup::thumbsup:', delete_after=40)
async def change_gender(self, ctx): try: channel_check(ctx) except ChannelException as error: await error.do(ctx) return user = ctx.message.author d = data_read(ctx.guild) if d['genders']: role1 = discord.utils.get(user.guild.roles, id=d['genders'][0]) role2 = discord.utils.get(user.guild.roles, id=d['genders'][1]) if role1 is None or role2 is None: await ctx.message.delete() await ctx.send(f'Упс! Кажется кто-то из админов сервера удалил роли. Попроси ' f'`{ctx.guild.owner.name}` поставить их заново :cowboy:', delete_after=40) if role1.name in [r.name for r in user.roles]: await user.remove_roles(role1) await user.add_roles(role2) else: await user.remove_roles(role2) await user.add_roles(role1) await ctx.message.delete() await ctx.send(f'{user.mention}, ты изменил свою гендерную роль :sunglasses:', delete_after=3) else: ctx.send('К сожалению, владелец сервера не назначили роли для гендерного распределения :weary:')
async def on_member_join(self, member): d = data_read(member.guild) embed = discord.Embed( colour=discord.Colour.from_rgb(r=43, g=181, b=81), description= f'{member.mention} добро пожаловать на сервер **{member.guild.name}**:heart_exclamation:\n\n' ) embed.set_author(name='новый участник сервера', icon_url=member.avatar_url) if d['autoroles_post_id']: for channel in member.guild.text_channels: try: msg = await channel.fetch_message(d['autoroles_post_id']) break except discord.errors.NotFound: msg = None if msg: embed.description += f'Обрати внимание на [этот пост]({msg.jump_url})' \ f'. Здесь ты можешь выбрать все интересующие тебя роли.:love_you_gesture:\n\n' if d['genders']: role = discord.utils.get(member.guild.roles, id=d['genders'][0]) await member.add_roles(role) embed.description += f'По умолчанию тебе добавлена гендерная роль `{role.name}` :male_sign:. ' \ f'Если хочешь изменить её - пропиши команду `.p.g`' embed.set_footer( text='Все мои команды ты можешь подсмотреть с помощью `.help`') info = discord.utils.find( lambda x: x.permissions_for(member.guild.me).send_messages, member.guild.text_channels) await info.send(embed=embed, delete_after=120)
async def now_(self, ctx): channel_check(ctx) await ctx.message.delete() d = data_read(ctx.guild) d['now'] = not d['now'] data_write(ctx.guild, d) await ctx.send(f'Настройка `сейчас играет` изменена на [ {int(d["now"])} ] :thumbsup:', delete_after=20)
async def on_raw_reaction_remove(self, payload): channel = self.client.get_channel(payload.channel_id) message = await channel.fetch_message(payload.message_id) member = await message.guild.fetch_member(payload.user_id) if member is not None: try: if member.id != 669163733473296395: d = data_read(message.guild) if int(d["autoroles_post_id"].split(',') [1]) == payload.message_id: try: role = discord.utils.get(message.guild.roles, id=d["autoroles"][str( payload.emoji)]) await member.remove_roles(role) except KeyError: return except discord.Forbidden: await channel.send( 'У бота недостаточно прав. Попробуй в настройках сервера ' 'расположить роль бота как можно выше :pleading_face:', delete_after=40) except Exception: await channel.send('Неизвестная ошибка :eyes:', delete_after=20)
async def notice_(self, ctx): channel_check(ctx) await ctx.message.delete() d = data_read(ctx.guild) d['notice'] = not d['notice'] data_write(ctx.guild, d) await ctx.send(f'Настройка `участник покинул канал` изменена на [ {int(d["notice"])} ] :thumbsup:', delete_after=20)
async def count_(self, ctx, *, n: int): channel_check(ctx) await ctx.message.delete() d = data_read(ctx.guild) if n < 5 or n > 10: raise commands.errors.BadArgument d['count'] = n data_write(ctx.guild, d) await ctx.send(f'Настройка `количество записей` изменена на [ {n} ] :thumbsup:', delete_after=20)
async def notice_(self, ctx): d = data_read(ctx.guild) if ctx.message.author.id in d['notices']: d['notices'].remove(ctx.message.author.id) else: d['notices'].append(ctx.message.author.id) data_write(ctx.guild, d) await ctx.send(f'`{ctx.message.author.name}` всё :ok:', delete_after=80)
async def on_member_remove(self, member): if not member.bot: d = data_read(member.guild) if d['autoroles_post_id']: msg = await discord.utils.get(member.guild.text_channels, id=int(d['autoroles_post_id'].split(',')[0])) \ .fetch_message(int(d['autoroles_post_id'].split(',')[1])) for e in d['autoroles'].keys(): try: await msg.remove_reaction(e, member) except Exception: continue
async def set_genders(self, ctx, *roles: typing.Union[discord.Role, str]): s = ctx.message.author.guild if len(roles) == 0: r1 = await s.create_role(name='♂', colour=discord.Colour.blue(), mentionable=True) r2 = await s.create_role(name='♀', colour=discord.Colour(16711893), mentionable=True) elif len(roles) == 2: if isinstance(roles[0], discord.Role): r1 = roles[0] r2 = roles[1] else: r1 = await s.create_role(name=roles[0], colour=discord.Colour.blue(), mentionable=True) r2 = await s.create_role(name=roles[1], colour=discord.Colour(16711893), mentionable=True) else: raise errors.BadArgument d = data_read(ctx.guild) d['genders'] = [r1.id, r2.id] data_write(ctx.guild, d) await ctx.message.delete() await ctx.send(f'" роли[`{r1.name}` и `{r2.name}`] успешно установлены как гендерные :male_sign: :female_sign:', delete_after=40)
async def set_roles_(self, ctx, *role: typing.Union[discord.Role, str]): try: text, reacts = '', {} for i in range(len(role)): r = role[i] t = [] if isinstance(r, discord.Role): t.append(r) if i < len(role) - 1 and isinstance(role[i + 1], str): t.append(role[i + 1]) i += 1 if i < len(role) - 1 and isinstance(role[i + 1], str): t.append(f' --- {role[i+1]}') i += 1 else: t.append("") else: print('h1') raise commands.errors.BadArgument text += f'{t[1]} : {t[0].mention}{t[2]}\n\n' reacts[t[1]] = t[0].id embed = discord.Embed(title="Раздача ролей", description=text, colour=discord.Colour.green()) embed.set_thumbnail(url=ctx.message.author.guild.owner.avatar_url) embed.set_footer( text='Нажмите на соответствующий Эмодзи, чтобы получить роль\n' ) d = data_read(ctx.guild) if not d['autoroles_post_id']: sms = await ctx.send(embed=embed) await sms.pin() d['autoroles'] = reacts d['autoroles_post_id'] = sms.id data_write(ctx.guild, d) for e in reacts: await sms.add_reaction(e) await ctx.message.delete() else: new_sms = await ctx.send( f'Пост для выдачи авторолей уже сущесвует :pushpin:\nСоздать новый?' ) await new_sms.add_reaction('🆕') await new_sms.add_reaction('🚫') def check(reaction, user): return user == ctx.message.author try: reaction, user = await self.client.wait_for('reaction_add', check=check, timeout=60) if str(reaction.emoji) == '🆕': if len(reacts) > 20: await ctx.send( 'Не удалось создать пост, т.к. невозможно добавить более 20 реакций на ' 'сообщение :no_entry:', delete_after=40) return d = data_read(ctx.guild) sms = await ctx.send(embed=embed) await sms.pin() d['autoroles'] = reacts d['autoroles_post_id'] = sms.id data_write(ctx.guild, d) for e in reacts: await sms.add_reaction(e) await ctx.message.delete() await new_sms.delete() except asyncio.TimeoutError: await new_sms.delete() except IndexError: await ctx.send( "Слишком много ролей без эмоджи. Попробуй заполнить их своими смайлами." ) except discord.HTTPException as e: if e.text == 'Unknown Emoji': await ctx.send( "Дискорд не смог распознать некоторые Эмодзи :anguished:\nПопробуй ещё раз", delete_after=30) else: pass except commands.errors.BadArgument: await ctx.send( "Данные введены неправильно, проверь ещё раз :writing_hand:", delete_after=20) except Exception: await exp(ctx) finally: try: await asyncio.sleep(10) await ctx.message.delete() except discord.HTTPException: pass
def channel_check(ctx): d = data_read(ctx.guild)['channels'] if d and ctx.channel.id not in d: raise ChannelException return True
async def set_roles_(self, ctx, *role: typing.Union[discord.Role, str]): if len(role) == 0: return await ctx.send(f'Ты забыл{postix(ctx)} указать роли') try: embed = discord.Embed( title="Раздача ролей", description='', colour=discord.Colour.green() ) if isinstance(role[0], str): if role[0] != '-i': embed.description = role[0]+'\n\n' if len(role) > 1 and isinstance(role[1], str) and role[1] == '-i': pass else: embed.set_thumbnail(url=ctx.guild.icon_url) else: embed.set_thumbnail(url=ctx.guild.icon_url) embed.set_footer(text='Нажмите на соответствующий Эмодзи, чтобы получить роль\n') text, reacts = '', {} for i in range(len(role)): r = role[i] t = [] if isinstance(r, discord.Role): t.append(r) if i < len(role)-1 and isinstance(role[i+1], str): t.append(role[i+1]) i += 1 if i < len(role)-1 and isinstance(role[i+1], str): t.append(f' --- {role[i+1]}') i += 1 else: t.append("") else: raise commands.errors.BadArgument text += f'{t[1]} : {t[0].mention}{t[2]}\n\n' reacts[t[1]] = t[0].id embed.description += text d = data_read(ctx.guild) if not d['autoroles_post_id']: sms = await ctx.send(embed=embed) await sms.pin() d['autoroles'] = reacts d['autoroles_post_id'] = f'{ctx.channel.id},{sms.id}' data_write(ctx.guild, d) for e in reacts: await sms.add_reaction(e) await ctx.message.delete() else: new_sms = await ctx.send(f'Пост для выдачи авторолей уже сущесвует :pushpin:\nСоздать новый?') await new_sms.add_reaction('🆕') await new_sms.add_reaction('🚫') def check(reaction, user): return user == ctx.message.author try: reaction, user = await self.client.wait_for('reaction_add', check=check, timeout=60) if str(reaction.emoji) == '🆕': if len(reacts) > 20: await ctx.send('Не удалось создать пост, т.к. невозможно добавить более 20 реакций на ' 'сообщение :no_entry:', delete_after=40) return try: msg_d = await discord.utils.get(ctx.guild.text_channels, id=int(d['autoroles_post_id'].split(',')[0]))\ .fetch_message(int(d['autoroles_post_id'].split(',')[1])) await msg_d.delete() except discord.HTTPException: pass except AttributeError: pass d = data_read(ctx.guild) sms = await ctx.send(embed=embed) await sms.pin() d['autoroles'] = reacts d['autoroles_post_id'] = f'{ctx.channel.id},{sms.id}' data_write(ctx.guild, d) for e in reacts: await sms.add_reaction(e) await ctx.message.delete() await new_sms.delete() except asyncio.TimeoutError: await new_sms.delete() except IndexError: await ctx.send("Аргументы переданы неверно :jack_o_lantern:", delete_after=40) except discord.HTTPException as e: if e.text == 'Unknown Emoji': await ctx.send("Дискорд не смог распознать некоторые Эмодзи :anguished:\nПопробуй ещё раз", delete_after=30) else: pass except commands.errors.BadArgument: await ctx.send("Данные введены неправильно, проверь ещё раз :writing_hand:", delete_after=20) except Exception: await exp(ctx) finally: try: await asyncio.sleep(10) await ctx.message.delete() except discord.HTTPException: pass