예제 #1
0
 def delete_rules(self, guild_id: int) -> int:
     return session.query(ACL_rule).filter(ACL_rule.guild_id == guild_id).delete()
예제 #2
0
 def deleteId(self, discord_id: int) -> int:
     count = session.query(User).filter(
         User.discord_id == discord_id).delete()
     session.commit()
     return count
예제 #3
0
 def filterStatus(self, status: str):
     return session.query(User).filter(User.status == status).all()
예제 #4
0
 def get(self, discord_id: int):
     """Get user from database"""
     return session.query(User).filter(
         User.discord_id == discord_id).one_or_none()
예제 #5
0
 def getByPrefix(self, prefix: str):
     """Get users from database"""
     return session.query(User).filter(User.login.startswith(prefix)).all()
예제 #6
0
    async def increment_roles(self, ctx):
        database.base.metadata.create_all(database.db)

        guild = self.bot.get_guild(config.guild_id)

        BIT_names = [str(x) + "BIT" + ("+" if x == 4 else "")
                     for x in range(5)]
        BIT = [discord.utils.get(guild.roles, name=role_name)
               for role_name in BIT_names]

        MIT_names = [str(x) + "MIT" + ("+" if x == 3 else "")
                     for x in range(4)]
        MIT = [discord.utils.get(guild.roles, name=role_name)
               for role_name in MIT_names]

        # pridat kazdeho 3BIT a 2MIT cloveka do DB pred tim nez je jebnem do
        # 4BIT+ respektive 3MIT+ role kvuli rollbacku
        session.query(User_backup).delete()

        for member in BIT[3].members:
            session.add(User_backup(member_ID=member.id))
        for member in MIT[2].members:
            session.add(User_backup(member_ID=member.id))

        session.commit()

        for member in BIT[3].members:
            await member.add_roles(BIT[4])
        for member in MIT[2].members:
            await member.add_roles(MIT[3])

        BIT_colors = [role.color for role in BIT]
        await BIT[3].delete()
        await BIT[2].edit(name="3BIT", color=BIT_colors[3])
        await BIT[1].edit(name="2BIT", color=BIT_colors[2])
        await BIT[0].edit(name="1BIT", color=BIT_colors[1])
        bit0 = await guild.create_role(name='0BIT', color=BIT_colors[0])
        await bit0.edit(position=BIT[0].position - 1)

        MIT_colors = [role.color for role in MIT]
        await MIT[2].delete()
        await MIT[1].edit(name="2MIT", color=MIT_colors[2])
        await MIT[0].edit(name="1MIT", color=MIT_colors[1])
        mit0 = await guild.create_role(name='0MIT', color=MIT_colors[0])
        await mit0.edit(position=MIT[0].position - 1)

        general_names = [str(x) + "bit-general" for x in range(4)]
        terminy_names = [str(x) + "bit-terminy" for x in range(1, 3)]
        general_channels = [discord.utils.get(guild.channels,
                                              name=channel_name)
                            for channel_name in general_names]
        terminy_channels = [discord.utils.get(guild.channels,
                                              name=channel_name)
                            for channel_name in terminy_names]
        # TODO: do smth about 4bit general next year, delete it in the meantime
        bit4_general = discord.utils.get(guild.channels, name="4bit-general")
        if bit4_general is not None:
            await bit4_general.delete()

        # move names
        await general_channels[3].edit(name="4bit-general")
        await general_channels[2].edit(name="3bit-general")
        await general_channels[1].edit(name="2bit-general")
        await general_channels[0].edit(name="1bit-general")
        # create 0bit-general
        overwrites = {
            guild.default_role:
                discord.PermissionOverwrite(read_messages=False),
            discord.utils.get(guild.roles, name="0BIT"):
                discord.PermissionOverwrite(read_messages=True,
                                            send_messages=True)
        }
        await guild.create_text_channel(
            '0bit-general', overwrites=overwrites,
            category=general_channels[0].category,
            position=general_channels[0].position - 1
        )

        # delete 3bit-terminy
        await discord.utils.get(guild.channels, name="3bit-terminy").delete()

        await terminy_channels[1].edit(name="3bit-terminy")
        await terminy_channels[0].edit(name="2bit-terminy")
        # create 1bit-terminy
        overwrites = {
            guild.default_role:
                discord.PermissionOverwrite(read_messages=False),
            discord.utils.get(guild.roles, name="1BIT"):
                discord.PermissionOverwrite(read_messages=True,
                                            send_messages=False)
        }
        await guild.create_text_channel(
            '1bit-terminy', overwrites=overwrites,
            category=terminy_channels[0].category,
            position=terminy_channels[0].position - 1
        )

        # give 4bit perms to the new 3bit terminy
        await terminy_channels[1].set_permissions(
            discord.utils.get(guild.roles, name="4BIT+"),
            read_messages=True, send_messages=False
        )

        # Give people the correct mandatory classes after increment
        semester_names = [str(x) + ". Semestr" for x in range(1, 6)]
        semester = [discord.utils.get(guild.categories, name=semester_name)
                    for semester_name in semester_names]
        await semester[0].set_permissions(discord.utils.get(guild.roles,
                                                            name="1BIT"),
                                          read_messages=True,
                                          send_messages=True)
        await semester[0].set_permissions(discord.utils.get(guild.roles,
                                                            name="2BIT"),
                                          overwrite=None)
        await semester[1].set_permissions(discord.utils.get(guild.roles,
                                                            name="1BIT"),
                                          read_messages=True,
                                          send_messages=True)
        await semester[1].set_permissions(discord.utils.get(guild.roles,
                                                            name="2BIT"),
                                          overwrite=None)
        await semester[2].set_permissions(discord.utils.get(guild.roles,
                                                            name="2BIT"),
                                          read_messages=True,
                                          send_messages=True)
        await semester[2].set_permissions(discord.utils.get(guild.roles,
                                                            name="3BIT"),
                                          overwrite=None)
        await semester[3].set_permissions(discord.utils.get(guild.roles,
                                                            name="2BIT"),
                                          read_messages=True,
                                          send_messages=True)
        await semester[3].set_permissions(discord.utils.get(guild.roles,
                                                            name="3BIT"),
                                          overwrite=None)
        await semester[4].set_permissions(discord.utils.get(guild.roles,
                                                            name="3BIT"),
                                          read_messages=True,
                                          send_messages=True)

        await ctx.send('Holy f**k, všechno se povedlo, '
                       'tak zase za rok <:Cauec:602052606210211850>')
예제 #7
0
 def countStatus(self, status: str):
     return session.query(User).filter(User.status == status).count()
예제 #8
0
 def get_rule(self, guild_id: int, command: str) -> Optional[ACL_rule]:
     return (
         session.query(ACL_rule)
         .filter(ACL_rule.guild_id == guild_id, ACL_rule.command == command)
         .one_or_none()
     )
예제 #9
0
 def groups(self):
     return session.query(RoleGroup).all()
예제 #10
0
 def get_group_by_role(self, role_id: int) -> Optional[ACL_group]:
     return session.query(ACL_group).filter(ACL_group.role_id == role_id).one_or_none()
예제 #11
0
 def get_rules(self, guild_id: int) -> Optional[List[ACL_rule]]:
     return session.query(ACL_rule).filter(ACL_rule.guild_id == guild_id).all()
예제 #12
0
 def get_group(self, guild_id: int, name: str) -> Optional[ACL_group]:
     return (
         session.query(ACL_group)
         .filter(ACL_group.guild_id == guild_id, ACL_group.name == name)
         .one_or_none()
     )
예제 #13
0
 def remove_user_constraint(self, constraint_id: int) -> bool:
     result = session.query(ACL_rule_user).filter(ACL_rule_user.id == constraint_id).delete()
     session.commit()
     return result > 0
예제 #14
0
 def get_groups(self, guild_id: int) -> Optional[List[ACL_group]]:
     return session.query(ACL_group).filter(ACL_group.guild_id == guild_id).all()
예제 #15
0
    async def update_db(self, ctx, convert_0xit: bool = False):
        with open("merlin-latest", "r") as f:
            data = f.readlines()

        found_people = []
        found_logins = []
        new_logins = []
        login_results = session.query(Valid_person.login).all()
        # Use unpacking on results
        old_logins = [value for value, in login_results]

        for line in data:
            line = line.split(":")
            login = line[0]
            name = line[4].split(",", 1)[0]
            try:
                year_fields = line[4].split(",")[1].split(" ")
                year = " ".join(year_fields if "mail=" not in
                                year_fields[-1] else year_fields[:-1])
                mail = year_fields[-1].replace(
                    "mail=", "") if "mail=" in year_fields[-1] else None
            except IndexError:
                continue

            if convert_0xit and year.endswith("1r"):
                person = session.query(Valid_person).filter(
                    Valid_person.login == login).one_or_none()
                if person is not None and person.year.endswith("0r"):
                    year = year.replace("1r", "0r")

            found_people.append(
                Valid_person(login=login, year=year, name=name, mail=mail))
            found_logins.append(login)

        for login in found_logins:
            if login not in old_logins:
                new_logins.append(login)

        await ctx.send(f"Našel jsem {len(new_logins)} nových loginů.")

        for person in found_people:
            session.merge(person)

        cnt_new = 0
        for person in session.query(Valid_person):
            if person.login not in found_logins:
                try:
                    # check for muni
                    int(person.login)
                    person.year = "MUNI"
                except ValueError:
                    person.year = "dropout"
            elif convert_0xit and person.login in new_logins:
                if person.year.endswith("1r"):
                    person.year = person.year.replace("1r", "0r")
                    cnt_new += 1

        session.commit()

        await ctx.send("Aktualizace databáze proběhla úspěšně.")
        if convert_0xit:
            await ctx.send(f"Debug: Našel jsem {cnt_new} nových prvaků.")
예제 #16
0
 def get_group(self, name):
     query = session.query(RoleGroup).filter(RoleGroup.name == str(name))
     return query.one_or_none()
예제 #17
0
    async def role_check(
        self,
        ctx,
        p_verified: bool = True,
        p_move: bool = False,
        p_status: bool = True,
        p_role: bool = True,
        p_zapis: bool = False,
        p_debug: bool = True,
    ):
        guild = self.bot.get_guild(config.guild_id)
        members = guild.members

        verify = disnake.utils.get(guild.roles, name="Verify")
        host = disnake.utils.get(guild.roles, name="Host")
        bot = disnake.utils.get(guild.roles, name="Bot")
        poradce = disnake.utils.get(guild.roles, name="Poradce")
        dropout = disnake.utils.get(guild.roles, name="Dropout")
        survivor = disnake.utils.get(guild.roles, name="Survivor")
        king = disnake.utils.get(guild.roles, name="King")
        vut = disnake.utils.get(guild.roles, name="VUT")

        dropout_alternatives = [survivor, king]

        verified = [
            member for member in members if verify in member.roles
            and host not in member.roles and bot not in member.roles
            and poradce not in member.roles and vut not in member.roles
        ]

        permited = session.query(Permit)
        permited_ids = [int(person.discord_ID) for person in permited]

        years = [
            "0BIT", "1BIT", "2BIT", "3BIT", "4BIT+", "0MIT", "1MIT", "2MIT",
            "3MIT+", "PhD+", "Dropout"
        ]

        year_roles = {
            year: disnake.utils.get(guild.roles, name=year)
            for year in years
        }

        weird_members = {
            year_y: {year_x: []
                     for year_x in year_roles.values()}
            for year_y in year_roles.values()
        }

        for member in verified:
            if member.id not in permited_ids:
                if p_verified:
                    await ctx.send("Ve verified databázi jsem nenašel: " +
                                   utils.generate_mention(member.id))
            else:
                try:
                    login = session.query(Permit).filter(
                        Permit.discord_ID == str(member.id)).one().login

                    person = session.query(Valid_person).filter(
                        Valid_person.login == login).one()
                except NoResultFound:
                    continue
                except MultipleResultsFound:
                    await ctx.send(f"{member.id} je v permit databazi vickrat?"
                                   )
                    continue

                if person.status != 0:
                    if p_status:
                        await ctx.send("Status nesedí u: " + login)

                year = self.verification.transform_year(person.year)

                if year is None:
                    year = "Dropout"

                correct_role = disnake.utils.get(guild.roles, name=year)

                if correct_role not in member.roles:
                    for role_name, role in year_roles.items():
                        if role in member.roles and correct_role in weird_members[
                                role].keys():
                            weird_members[role][correct_role].append(member)
                            break
                    else:
                        if correct_role == dropout and not any(
                                role in member.roles
                                for role in dropout_alternatives):
                            await ctx.send(
                                f"{utils.generate_mention(member.id)} by mel "
                                f"mit prej `{year}`")

        for source_role, target_data in weird_members.items():
            for target_role, target_members in target_data.items():
                if len(target_members) == 0:
                    continue
                source_year = source_role.name
                target_year = target_role.name
                target_ids = [member.id for member in target_members]
                if (p_zapis
                        and (("BIT" in source_year and "BIT" in target_year) or
                             ("MIT" in source_year and "MIT" in target_year))
                        and int(source_year[0]) == int(target_year[0]) + 1):
                    message_prefix = (
                        "Vypada ze do dalsiho rocniku se nezapsali "
                        f"(protoze na merlinovi maji {target_year}): ")
                    await self.send_masstag_messages(ctx, message_prefix,
                                                     target_ids)
                elif p_move and (
                        # presun bakalaru do 1MIT
                    ("BIT" in source_year and target_year == "1MIT")
                        or target_year == "Dropout"):
                    await ctx.send(
                        f"Přesouvám techle {len(target_members)} lidi z "
                        f"{source_year} do {target_year}:")
                    await self.send_masstag_messages(ctx, "", target_ids)
                    if p_debug:
                        await ctx.send("jk, debug mode")
                    else:
                        for member in target_members:
                            if target_role == dropout and not any(
                                    role in member.roles
                                    for role in dropout_alternatives):
                                await member.add_roles(target_role)
                            await member.remove_roles(source_role)
                elif p_role:
                    await ctx.send(
                        f"Nasel jsem {len(target_members)} lidi kteri maji na merlinovi "
                        f"{target_year} ale roli {source_year}:")
                    await self.send_masstag_messages(ctx, "", target_ids)

        await ctx.send("Done")
예제 #18
0
 def user_exist(user_id: int) -> bool:
     return session.query(
         session.query(User).filter(
             User.id == str(user_id)).exists()).scalar()
예제 #19
0
    async def role_check(self, ctx, p_verified: bool = True,
                         p_move: bool = True, p_status: bool = True,
                         p_role: bool = True, p_muni: bool = True):
        guild = self.bot.get_guild(config.guild_id)
        members = guild.members

        verify = discord.utils.get(guild.roles, name="Verify")
        host = discord.utils.get(guild.roles, name="Host")
        bot = discord.utils.get(guild.roles, name="Bot")
        poradce = discord.utils.get(guild.roles, name="Poradce")
        dropout = discord.utils.get(guild.roles, name="Dropout")
        muni = discord.utils.get(guild.roles, name="MUNI")

        verified = [member for member in members
                    if verify in member.roles and
                    host not in member.roles and
                    bot not in member.roles and
                    poradce not in member.roles]

        if not p_muni:
            verified = [member for member in verified
                        if muni not in member.roles]

        permited = session.query(Permit)
        permited_ids = [int(person.discord_ID) for person in permited]

        years = ["0BIT", "1BIT", "2BIT", "3BIT", "4BIT+",
                 "0MIT", "1MIT", "2MIT", "3MIT+", "Dropout"]

        year_roles = {year: discord.utils.get(guild.roles, name=year) for year in years}

        for member in verified:
            if member.id not in permited_ids:
                if p_verified:
                    await ctx.send("Ve verified databázi jsem nenašel: " +
                                   utils.generate_mention(member.id))
            else:
                try:
                    login = session.query(Permit).\
                        filter(Permit.discord_ID == str(member.id)).one().login

                    person = session.query(Valid_person).\
                        filter(Valid_person.login == login).one()
                except NoResultFound:
                    continue

                if person.status != 0:
                    if p_status:
                        await ctx.send("Status nesedí u: " + login)

                year = self.verification.transform_year(person.year)

                correct_role = discord.utils.get(guild.roles, name=year)

                if year is not None and correct_role not in member.roles:
                    if p_move:
                        for role_name, role in year_roles.items():
                            if role in member.roles:
                                await member.add_roles(correct_role)
                                await member.remove_roles(role)
                                await ctx.send("Přesouvám: " + member.display_name +
                                               " z " + role_name + " do " + year)
                                break
                        else:
                            await member.add_roles(dropout)
                            await ctx.send("Přesouvám: " + member.display_name +
                                           " z " + role_name + " do dropout")
                    elif p_role:
                        await ctx.send("Nesedí mi role u: " +
                                       utils.generate_mention(member.id) +
                                       ", měl by mít roli: " + year)
                elif year is None:
                    if p_move:
                        for role_name, role in year_roles.items():
                            if role in member.roles:
                                await member.add_roles(dropout)
                                await member.remove_roles(role)
                                await ctx.send("Přesouvám: " + member.display_name +
                                               " z " + role_name + " do dropout")
                                break
                        else:
                            await member.add_roles(dropout)
                            await ctx.send("Přesouvám: " + member.display_name +
                                           " z " + role_name + " do dropout")
                    elif p_role:
                        await ctx.send("Nesedí mi role u: " +
                                       utils.generate_mention(member.id) +
                                       ", má teď ročník: " + person.year)

        await ctx.send("Done")
예제 #20
0
 def delete_user(user_id: int):
     session.query(User).filter(User.id == str(user_id)).delete()
     session.commit()
예제 #21
0
 def countGroup(self, group: str):
     return session.query(User).filter(User.group == group).count()
예제 #22
0
 def guild_user_exist(user_id: int, guild_id: int) -> bool:
     return session.query(
         session.query(GuildUser).filter(
             GuildUser.id == str(user_id),
             GuildUser.guild_id == str(guild_id)).exists()).scalar()
예제 #23
0
 def getByLogin(self, login: str):
     """Get user from database"""
     return session.query(User).filter(User.login == login).one_or_none()
예제 #24
0
 def get_user(self, login: str, status: int = 2):
     """"Finds login from database"""
     user = (session.query(Valid_person).filter(
         Valid_person.login == login,
         Valid_person.status == status).one_or_none())
     return user
예제 #25
0
 def filterId(self, discord_id: int):
     """Find user in database"""
     users = session.query(User).filter(User.discord_id == discord_id).all()
     return users
예제 #26
0
 def get_user_by_id(self, discord_ID):
     """Returns user specified by discord ID"""
     return (session.query(Valid_person).outerjoin(
         Permit, Permit.login == Valid_person.login).filter(
             Permit.discord_ID == str(discord_ID)).one_or_none())
예제 #27
0
 def filterLogin(self, login: str):
     return session.query(User).filter(User.login == login).all()
예제 #28
0
    def get_user_by_login(self, login: str):
        """Finds login from DB (without status check)"""
        user = (session.query(Valid_person).filter(
            Valid_person.login == login).one_or_none())

        return user
예제 #29
0
 def filterGroup(self, group: str):
     return session.query(User).filter(User.group == group).all()
예제 #30
0
 def remove_emoji(self, emoji_id):
     session.query(Karma_emoji).filter(
         Karma_emoji.emoji_ID == utils.str_emoji_id(emoji_id)).delete()
     session.commit()