Skip to content

Giveroles

Bases: Extension

Source code in extentions/giveroles.py
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
class GiveRoles(Extension):
    def __init__(self, bot: Client):
        self.bot = bot

    give_cmd = SlashCommand(name='give', default_member_permissions=Permissions.BAN_MEMBERS)
    giveyou_cmd = SlashCommand(name='giveyou', default_member_permissions=Permissions.BAN_MEMBERS)

    @give_cmd.subcommand(sub_cmd_name='you', sub_cmd_description="Give members a role from predefined list of roles")
    @user()
    @giveyou_name()
    async def giveyourole(self, ctx: InteractionContext, user:OptionType.USER=None, giveyou_name:str=None):
        """/giveyou
        Description:
            Give members a role from predefined list of roles

        Args:
            user (OptionType.USER, optional): User to give or remove role from
            giveyou_name (str, optional): Name of the giveyou.
        """
        if user is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a user"), ephemeral=True)
        if giveyou_name is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)


        regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
        gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

        if gy is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: Couldn't find `{giveyou_name}` as a giveyou for {ctx.guild.name}"), ephemeral=True)

        role = ctx.guild.get_role(gy.roleid)

        if role in user.roles:
            await user.remove_role(role, reason=f'{ctx.author.display_name}|{ctx.author.id} removed a giveyou {giveyou_name}')
            embed = Embed(
                description=f"I have removed {role.mention} from {user.mention}",
                color=0xffcc50)
        elif role not in user.roles:
            await user.add_role(role, reason=f'{ctx.author.display_name}|{ctx.author.id} assigned a giveyou {giveyou_name}')
            embed = Embed(
                description=f"I have assigned {role.mention} to {user.mention}",
                color=0xffcc50)
        await ctx.send(embed=embed)

    @giveyou_cmd.subcommand(sub_cmd_name='create', sub_cmd_description="Create giveyou's")
    @giveyou_name()
    @role()
    async def giveyourole_create(self, ctx: InteractionContext, giveyou_name:str=None, role:OptionType.ROLE=None):
        """/giveyou create
        Description:
            Create a giveyou role.
        Args:
            giveyou_name (str, optional): Name of the giveyou.
            role (OptionType.ROLE, optional): Role associated with the giveyou.
        """
        if giveyou_name is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)
        if role is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a role"), ephemeral=True)


        regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
        gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

        if gy is not None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: `{giveyou_name}` already exists as a giveyou for {ctx.guild.name}"), ephemeral=True)

        while True:
            gyid = random_string_generator()
            gyid_db = await db.giveyou.find_one({'guildid':ctx.guild.id, 'giveyou_id':gyid})
            if gyid_db is None:
                break
            else:
                continue

        await db.giveyou(guildid=ctx.guild_id, name=giveyou_name, roleid=role.id, giveyou_id=gyid).insert()
        await ctx.send(embed=Embed(color=0xffcc50, description=f"giveyou `{giveyou_name}` created for {role.mention}"))

    @giveyou_cmd.subcommand(sub_cmd_name='delete', sub_cmd_description="Delete giveyou's")
    @giveyou_name()
    async def giveyourole_delete(self, ctx: InteractionContext, giveyou_name:str=None):
        """/giveyou delete
        Description:
            Delete a giveyou

        Args:
            giveyou_name (str, optional): Name of the giveyou to delete.
        """
        if giveyou_name is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)

        regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
        gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

        if gy is not None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: `{giveyou_name}` is not a giveyou for {ctx.guild.name}"), ephemeral=True)

        role = ctx.guild.get_role(gy.roleid)
        await ctx.send(embed=Embed(color=0xffcc50, description=f"giveyou `{giveyou_name}` deleted from {role.mention}"))
        await gy.delete()

    @giveyou_cmd.subcommand( sub_cmd_name='list', sub_cmd_description="Lists all giveyous for guild")
    async def giveyourole_list(self, ctx: InteractionContext):
        """/giveyou list
        Description:
            List all giveyous
        """
        from interactions.ext.paginators import Paginator
        def chunks(l, n):
            n = max(1, n)
            return (l[i:i+n] for i in range(0, len(l), n))

        def page_list(lst, s, e):
            nc = list(chunks(lst, 20))
            mc = ''
            for testlist in nc[s:e]:
                for m in testlist:
                    mc = mc + m
            return mc

        def newpage(title, names, roles):
            embed = Embed(title=title,
            color=0xffcc50)
            embed.add_field(name='Giveyou', value=names, inline=True)
            embed.add_field(name='Role', value=roles, inline=True)
            return embed


        gy = db.giveyou.find({"guildid":ctx.guild_id})
        names = []
        roles = []
        async for g in gy:
            names.append(f"{g.name}\n")
            role = ctx.guild.get_role(g.roleid)
            if role is None:
                roles.append(f'[ROLE NOT FOUND]({g.roleid})\n')
            else:
                roles.append(f"{role.mention}\n")
        if names == []:
            embed = Embed(description=f"There are no giveyous for {ctx.guild.name}.",
                        color=0xffcc50)
            await ctx.send(embed=embed)
            return
        s = -1
        e = 0
        embedcount = 1
        nc = list(chunks(names, 20))

        embeds = []
        while embedcount <= len(nc):
            s = s+1
            e = e+1
            embeds.append(newpage(f'List of giveyous for {ctx.guild.name}', page_list(names, s, e), page_list(roles, s, e)))
            embedcount = embedcount+1

        paginator = Paginator(
            client=self.bot, 
            pages=embeds,
            timeout_interval=80,
            show_select_menu=False)
        await paginator.send(ctx)

    @slash_command(name='role', description="Add/remove users to a role or roles",
        default_member_permissions=Permissions.MANAGE_ROLES
    )
    @members()
    @roles()
    async def give_role(self, ctx: InteractionContext, members:str=None, roles:str=None):
        """/give role
        Description:
            Add/remove users to a role or roles
        Args:
            members (str, optional): Members IDs or @member, seperated by a comma `,`
            roles (str, optional): Roles IDs or @role, seperated by a comma `,`
        """
        if members is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a user"), ephemeral=True)
        if roles is None:
            return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a role"), ephemeral=True)

        raw_mem_list = members.split(',')
        member_list =[]
        for m in raw_mem_list:
            m = m.replace('<', '')
            m = m.replace('@', '')
            m = m.replace('!', '')
            m = m.replace('&', '')
            m = m.replace('>', '')
            member_list.append(m)

        raw_roles_list = roles.split(',')
        roles_list = []
        for r in raw_roles_list:
            r = r.replace('<', '')
            r = r.replace('@', '')
            r = r.replace('!', '')
            r = r.replace('&', '')
            r = r.replace('>', '')
            roles_list.append(r)

        for member_id in member_list:
            member = ctx.guild.get_member(member_id)
            removed_roles = 'I have removed: '
            added_roles = 'I have assigned: '
            for role_id in roles_list:
                role = ctx.guild.get_role(role_id)
                if member.has_role(role) == True:
                    await member.remove_role(role)
                    removed_roles = removed_roles + f' {role.mention}'
                else:
                    await member.add_role(role)
                    added_roles = added_roles + f' {role.mention}'
            embed = Embed(description=f'Roles changed for {member.mention}\n\n{added_roles}\n\n{removed_roles}', color=0xffcc50)
            await ctx.send(embed=embed)

giveyourole(ctx, user=None, giveyou_name=None) async

/giveyou

Description

Give members a role from predefined list of roles

Parameters:

Name Type Description Default
user OptionType.USER

User to give or remove role from

None
giveyou_name str

Name of the giveyou.

None
Source code in extentions/giveroles.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@give_cmd.subcommand(sub_cmd_name='you', sub_cmd_description="Give members a role from predefined list of roles")
@user()
@giveyou_name()
async def giveyourole(self, ctx: InteractionContext, user:OptionType.USER=None, giveyou_name:str=None):
    """/giveyou
    Description:
        Give members a role from predefined list of roles

    Args:
        user (OptionType.USER, optional): User to give or remove role from
        giveyou_name (str, optional): Name of the giveyou.
    """
    if user is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a user"), ephemeral=True)
    if giveyou_name is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)


    regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
    gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

    if gy is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: Couldn't find `{giveyou_name}` as a giveyou for {ctx.guild.name}"), ephemeral=True)

    role = ctx.guild.get_role(gy.roleid)

    if role in user.roles:
        await user.remove_role(role, reason=f'{ctx.author.display_name}|{ctx.author.id} removed a giveyou {giveyou_name}')
        embed = Embed(
            description=f"I have removed {role.mention} from {user.mention}",
            color=0xffcc50)
    elif role not in user.roles:
        await user.add_role(role, reason=f'{ctx.author.display_name}|{ctx.author.id} assigned a giveyou {giveyou_name}')
        embed = Embed(
            description=f"I have assigned {role.mention} to {user.mention}",
            color=0xffcc50)
    await ctx.send(embed=embed)

giveyourole_create(ctx, giveyou_name=None, role=None) async

/giveyou create

Description

Create a giveyou role.

Parameters:

Name Type Description Default
giveyou_name str

Name of the giveyou.

None
role OptionType.ROLE

Role associated with the giveyou.

None
Source code in extentions/giveroles.py
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@giveyou_cmd.subcommand(sub_cmd_name='create', sub_cmd_description="Create giveyou's")
@giveyou_name()
@role()
async def giveyourole_create(self, ctx: InteractionContext, giveyou_name:str=None, role:OptionType.ROLE=None):
    """/giveyou create
    Description:
        Create a giveyou role.
    Args:
        giveyou_name (str, optional): Name of the giveyou.
        role (OptionType.ROLE, optional): Role associated with the giveyou.
    """
    if giveyou_name is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)
    if role is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a role"), ephemeral=True)


    regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
    gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

    if gy is not None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: `{giveyou_name}` already exists as a giveyou for {ctx.guild.name}"), ephemeral=True)

    while True:
        gyid = random_string_generator()
        gyid_db = await db.giveyou.find_one({'guildid':ctx.guild.id, 'giveyou_id':gyid})
        if gyid_db is None:
            break
        else:
            continue

    await db.giveyou(guildid=ctx.guild_id, name=giveyou_name, roleid=role.id, giveyou_id=gyid).insert()
    await ctx.send(embed=Embed(color=0xffcc50, description=f"giveyou `{giveyou_name}` created for {role.mention}"))

giveyourole_delete(ctx, giveyou_name=None) async

/giveyou delete

Description

Delete a giveyou

Parameters:

Name Type Description Default
giveyou_name str

Name of the giveyou to delete.

None
Source code in extentions/giveroles.py
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
@giveyou_cmd.subcommand(sub_cmd_name='delete', sub_cmd_description="Delete giveyou's")
@giveyou_name()
async def giveyourole_delete(self, ctx: InteractionContext, giveyou_name:str=None):
    """/giveyou delete
    Description:
        Delete a giveyou

    Args:
        giveyou_name (str, optional): Name of the giveyou to delete.
    """
    if giveyou_name is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a giveyou name"), ephemeral=True)

    regx = {'$regex': f"^{re.escape(giveyou_name)}$", '$options':'i'}
    gy = await db.giveyou.find_one({'name':regx, 'guildid': ctx.guild_id})

    if gy is not None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=f":x: `{giveyou_name}` is not a giveyou for {ctx.guild.name}"), ephemeral=True)

    role = ctx.guild.get_role(gy.roleid)
    await ctx.send(embed=Embed(color=0xffcc50, description=f"giveyou `{giveyou_name}` deleted from {role.mention}"))
    await gy.delete()

giveyourole_list(ctx) async

/giveyou list

Description

List all giveyous

Source code in extentions/giveroles.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
@giveyou_cmd.subcommand( sub_cmd_name='list', sub_cmd_description="Lists all giveyous for guild")
async def giveyourole_list(self, ctx: InteractionContext):
    """/giveyou list
    Description:
        List all giveyous
    """
    from interactions.ext.paginators import Paginator
    def chunks(l, n):
        n = max(1, n)
        return (l[i:i+n] for i in range(0, len(l), n))

    def page_list(lst, s, e):
        nc = list(chunks(lst, 20))
        mc = ''
        for testlist in nc[s:e]:
            for m in testlist:
                mc = mc + m
        return mc

    def newpage(title, names, roles):
        embed = Embed(title=title,
        color=0xffcc50)
        embed.add_field(name='Giveyou', value=names, inline=True)
        embed.add_field(name='Role', value=roles, inline=True)
        return embed


    gy = db.giveyou.find({"guildid":ctx.guild_id})
    names = []
    roles = []
    async for g in gy:
        names.append(f"{g.name}\n")
        role = ctx.guild.get_role(g.roleid)
        if role is None:
            roles.append(f'[ROLE NOT FOUND]({g.roleid})\n')
        else:
            roles.append(f"{role.mention}\n")
    if names == []:
        embed = Embed(description=f"There are no giveyous for {ctx.guild.name}.",
                    color=0xffcc50)
        await ctx.send(embed=embed)
        return
    s = -1
    e = 0
    embedcount = 1
    nc = list(chunks(names, 20))

    embeds = []
    while embedcount <= len(nc):
        s = s+1
        e = e+1
        embeds.append(newpage(f'List of giveyous for {ctx.guild.name}', page_list(names, s, e), page_list(roles, s, e)))
        embedcount = embedcount+1

    paginator = Paginator(
        client=self.bot, 
        pages=embeds,
        timeout_interval=80,
        show_select_menu=False)
    await paginator.send(ctx)

give_role(ctx, members=None, roles=None) async

/give role

Description

Add/remove users to a role or roles

Parameters:

Name Type Description Default
members str

Members IDs or @member, seperated by a comma ,

None
roles str

Roles IDs or @role, seperated by a comma ,

None
Source code in extentions/giveroles.py
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
@slash_command(name='role', description="Add/remove users to a role or roles",
    default_member_permissions=Permissions.MANAGE_ROLES
)
@members()
@roles()
async def give_role(self, ctx: InteractionContext, members:str=None, roles:str=None):
    """/give role
    Description:
        Add/remove users to a role or roles
    Args:
        members (str, optional): Members IDs or @member, seperated by a comma `,`
        roles (str, optional): Roles IDs or @role, seperated by a comma `,`
    """
    if members is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a user"), ephemeral=True)
    if roles is None:
        return await ctx.send(embed=Embed(color=0xDD2222, description=":x: Please provide a role"), ephemeral=True)

    raw_mem_list = members.split(',')
    member_list =[]
    for m in raw_mem_list:
        m = m.replace('<', '')
        m = m.replace('@', '')
        m = m.replace('!', '')
        m = m.replace('&', '')
        m = m.replace('>', '')
        member_list.append(m)

    raw_roles_list = roles.split(',')
    roles_list = []
    for r in raw_roles_list:
        r = r.replace('<', '')
        r = r.replace('@', '')
        r = r.replace('!', '')
        r = r.replace('&', '')
        r = r.replace('>', '')
        roles_list.append(r)

    for member_id in member_list:
        member = ctx.guild.get_member(member_id)
        removed_roles = 'I have removed: '
        added_roles = 'I have assigned: '
        for role_id in roles_list:
            role = ctx.guild.get_role(role_id)
            if member.has_role(role) == True:
                await member.remove_role(role)
                removed_roles = removed_roles + f' {role.mention}'
            else:
                await member.add_role(role)
                added_roles = added_roles + f' {role.mention}'
        embed = Embed(description=f'Roles changed for {member.mention}\n\n{added_roles}\n\n{removed_roles}', color=0xffcc50)
        await ctx.send(embed=embed)