Exemple #1
0
 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
Exemple #2
0
 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)
Exemple #3
0
 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:')
Exemple #4
0
 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)
Exemple #5
0
 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)
Exemple #6
0
 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)
Exemple #7
0
 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)
Exemple #8
0
 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)
Exemple #9
0
 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)
Exemple #10
0
 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
Exemple #11
0
 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)
Exemple #12
0
    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
Exemple #13
0
def channel_check(ctx):
    d = data_read(ctx.guild)['channels']
    if d and ctx.channel.id not in d:
        raise ChannelException
    return True
Exemple #14
0
    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