Example #1
0
    async def __get_channel(self, guild: discord.Guild) -> discord.TextChannel:
        """Gets the best text channel to use for event notices.

    Order of priority:
    1. User-defined channel
    2. Guild's system channel (if bot can speak in it)
    3. First channel that the bot can speak in
    """

        channel = None

        channel_id = await self.config.guild(guild).channel()
        if channel_id is not None:
            channel = guild.get_channel(channel_id)

        if channel is None or not self.__can_speak_in(channel):
            channel = guild.system_channel

        if channel is None or not self.__can_speak_in(channel):
            for ch in guild.text_channels:
                if self.__can_speak_in(ch):
                    channel = ch
                    break

        return channel
Example #2
0
 async def _check_all_perms(self, guild: discord.Guild, detailed=False):
     """Check all permissions for all AutoRooms in a guild."""
     result_required = True
     result_optional = True
     result_list = []
     avcs = await self.get_all_autoroom_source_configs(guild)
     for avc_id, avc_settings in avcs.items():
         autoroom_source = guild.get_channel(avc_id)
         category_dest = guild.get_channel(avc_settings["dest_category_id"])
         if autoroom_source and category_dest:
             if detailed:
                 (
                     required_check,
                     optional_check,
                     detail,
                 ) = self.check_perms_source_dest(
                     autoroom_source,
                     category_dest,
                     with_manage_roles_guild=avc_settings["room_type"] !=
                     "server",
                     with_text_channel=avc_settings["text_channel"],
                     with_optional_clone_perms=True,
                     split_required_optional_check=True,
                     detailed=True,
                 )
                 result_list.append(detail)
                 result_required = result_required and required_check
                 result_optional = result_optional and optional_check
             else:
                 required_check, optional_check = self.check_perms_source_dest(
                     autoroom_source,
                     category_dest,
                     with_manage_roles_guild=avc_settings["room_type"] !=
                     "server",
                     with_text_channel=avc_settings["text_channel"],
                     with_optional_clone_perms=True,
                     split_required_optional_check=True,
                 )
                 result_required = result_required and required_check
                 result_optional = result_optional and optional_check
                 if not result_required and not result_optional:
                     return result_required, result_optional
     if detailed:
         return result_required, result_optional, result_list
     else:
         return result_required, result_optional
Example #3
0
 def __init__(self, guild: discord.Guild):
     super().__init__()
     self.iterator: discord.guild.AuditLogIterator = guild.audit_logs(
         limit=None, action=discord.AuditLogAction.ban)
     self._cache: list[discord.AuditLogEntry] = []
     self._ncache = 0
     self._more = True
     self._n_last_fetched = 0
Example #4
0
 def _find_role(guild: discord.Guild,
                argument: str) -> Optional[discord.Role]:
     match = _ID_RE.match(argument) or _ROLE_MENTION_RE.match(argument)
     if match:
         result = guild.get_role(int(match.group(1)))
     else:
         result = discord.utils.get(guild.roles, name=argument)
     return result
Example #5
0
async def get_member(guild: discord.Guild, member):
    if isinstance(member, discord.Member):
        return member
    elif isinstance(member, int):
        return guild.get_member(int)
    elif isinstance(member, str):
        return get_member_named(guild, member)
    return member
Example #6
0
def get_owner(embed: discord.Embed, guild: discord.Guild) -> discord.Member:
    value = get_embed_field("Owner", embed)

    if value is None:
        return

    user_id = int(re.search('<@([0-9]*)>', value).groups()[0])
    return guild.get_member(user_id)
Example #7
0
async def get_member(guild: Guild, user: User) -> Member:
    member = guild.get_member(user.id)
    if not member:
        try:
            member = await guild.fetch_member(user.id)
        except NotFound:
            raise MemberNotFound(f"No member with ID: {user.id} on guild {guild.id}")
    return member
Example #8
0
    async def get_starboard_channel(self, server: discord.Guild) -> discord.TextChannel:

        channel_id = await self.get_starboard_channel_id(server)

        if (channel_id != 0):
            return server.get_channel(channel_id)

        return None
Example #9
0
    async def send_report(self, msg: discord.Message, guild: discord.Guild):

        author = guild.get_member(msg.author.id)
        report = msg.clean_content

        channel_id = await self.config.guild(guild).output_channel()
        channel = guild.get_channel(channel_id)
        if channel is None:
            return None

        files: List[discord.File] = await Tunnel.files_from_attach(msg)

        ticket_number = await self.config.guild(guild).next_ticket()
        await self.config.guild(guild).next_ticket.set(ticket_number + 1)

        if await self.bot.embed_requested(channel, author):
            em = discord.Embed(description=report)
            em.set_author(
                name=_("Report from {author}{maybe_nick}").format(
                    author=author,
                    maybe_nick=(f" ({author.nick})" if author.nick else "")),
                icon_url=author.avatar_url,
            )
            em.set_footer(text=_("Report #{}").format(ticket_number))
            send_content = None
        else:
            em = None
            send_content = _(
                "Report from {author.mention} (Ticket #{number})").format(
                    author=author, number=ticket_number)
            send_content += "\n" + report

        try:
            await Tunnel.message_forwarder(destination=channel,
                                           content=send_content,
                                           embed=em,
                                           files=files)
        except (discord.Forbidden, discord.HTTPException):
            return None

        await self.config.custom("REPORT", guild.id,
                                 ticket_number).report.set({
                                     "user_id": author.id,
                                     "report": report
                                 })
        return ticket_number
Example #10
0
 async def getmuterole(self, guild: discord.Guild):
     """Return the role used to mute users, or None if unavailable."""
     role_id_tuple = self.con.execute(
         "SELECT role_id FROM moderationsettings WHERE guild_id = ?",
         (guild.id, )).fetchone()
     # See explanation for the and statements above in the modlog channel section
     return role_id_tuple and role_id_tuple[0] and guild.get_role(
         role_id_tuple[0])
Example #11
0
def closest_user(member_string, guild: discord.Guild):
    if member_string.startswith('<@!') and member_string.endswith('>'):
        return guild.get_member(int(member_string[3:-1]))

    return list(
        sorted(guild.members,
               key=lambda member: fuzz.partial_token_sort_ratio(
                   member_string.lower(), member.display_name.lower())))[-1]
Example #12
0
 async def give_roles(self,invite:discord.Invite,guild:discord.Guild):
     """Give a role to admins of partners"""
     if isinstance(invite.guild,discord.Guild):
         if guild.id == 356067272730607628 and self.bot.beta:
             return
         roles = await self.bot.cogs['ServerCog'].find_staff(guild.id,'partner_role')
         roles = [x for x in [guild.get_role(int(x)) for x in roles.split(';') if len(x)>0 and x.isnumeric()] if x!=None]
         admins = [x for x in invite.guild.members if x.guild_permissions.administrator]
         for admin in admins:
             if admin in guild.members:
                 member = guild.get_member(admin.id)
                 for role in roles:
                     if role not in member.roles:
                         try:
                             await member.add_roles(role)
                         except:
                             pass
Example #13
0
    async def build_profile_embed(self, karma_member: KarmaMember,
                                  guild: discord.Guild) -> discord.Embed:
        """
        Build the profile embed with top channel breakdown configured
        :param karma_member: member whose profile to show
        :param guild: the discord guild
        :return: discord.Embed
        """
        channel_cursor = self.karma_service.aggregate_member_by_channels(
            karma_member)
        embed: discord.Embed = discord.Embed(colour=embed_color)
        embed.description = "Karma Profile with breakdown of top {} channels".format(
            profile()["channels"])
        channel_list = list(channel_cursor)
        total_karma = self.karma_service.aggregate_member_by_karma(
            karma_member)
        if len(channel_list) > 0:
            embed.add_field(name="0", value="0", inline=False)
            index = 0
            for document in channel_list:
                channel = guild.get_channel(int(document["_id"]["channel_id"]))
                if (index % 3) == 0 and index != 0:
                    if channel is None:
                        embed.add_field(
                            name=bold_field.format("deleted channel"),
                            value=document["karma"],
                            inline=False,
                        )
                    else:
                        embed.add_field(
                            name=bold_field.format(channel.name),
                            value=document["karma"],
                            inline=False,
                        )
                else:
                    if channel is None:
                        embed.add_field(
                            name=bold_field.format("deleted channel"),
                            value=document["karma"],
                            inline=True,
                        )
                    else:
                        embed.add_field(
                            name=bold_field.format(channel.name),
                            value=document["karma"],
                            inline=True,
                        )

            embed = add_filler_fields(embed, channel_list)
            embed.set_field_at(index=0,
                               name="**total**",
                               value=str(total_karma),
                               inline=False)
            return embed
        else:
            # small embed since no karma etc.
            embed.add_field(name="**total**", value="0", inline=False)
            return embed
Example #14
0
    async def bump_message(self, guild: discord.Guild):
        guild = self.bot.get_guild(guild.id)
        if not guild:
            return
        data = await self.config.guild(guild).all()
        channel = guild.get_channel(data["channel"])

        if not channel or not channel.permissions_for(guild.me).send_messages:
            await self.config.guild(guild).channel.clear()
            return

        my_perms = channel.permissions_for(guild.me)
        if data["lock"] and my_perms.manage_roles:
            if my_perms.send_messages is not True:
                my_perms.update(send_messages=True)
                await channel.set_permissions(
                    guild.me,
                    overwrite=my_perms,
                    reason="DisboardReminder auto-lock")

            current_perms = channel.overwrites_for(guild.default_role)
            if current_perms.send_messages is not None:
                current_perms.update(send_messages=None)
                await channel.set_permissions(
                    guild.default_role,
                    overwrite=current_perms,
                    reason="DisboardReminder auto-lock",
                )

        if data["role"]:
            role = guild.get_role(data["role"])
            if role:
                message = f"{role.mention}: {data['message']}"
                await self.bot.get_cog("ForceMention").forcemention(
                    channel, role, message)
            else:
                await self.config.guild(guild).role.clear()
        else:
            message = data["message"]
            mentionPerms = discord.AllowedMentions(roles=True)
            try:
                await channel.send(message, allowed_mentions=mentionPerms)
            except discord.errors.Forbidden:
                await self.config.guild(guild).channel.clear()
        await self.config.guild(guild).nextBump.clear()
Example #15
0
    def _create_table(cursor: sqlite3.Cursor,
                      guild: discord.Guild,
                      *,
                      show_id: bool = True) -> str:
        tabular_data = defaultdict(list)
        for strike in cursor:
            with contextlib.suppress(IndexError):
                user = guild.get_member(strike["user"])
                tabular_data[_("User")].append(user)
            with contextlib.suppress(IndexError):
                mod_id = strike["moderator"]
                tabular_data[_("Moderator")].append(
                    guild.get_member(mod_id) or mod_id)
            with contextlib.suppress(IndexError):
                strike_id = strike["id"]
                tabular_data[_("Time & Date (UTC)")].append(
                    discord.utils.snowflake_time(strike_id).strftime(
                        "%Y-%m-%d %H:%M"))
                if show_id is True:
                    tabular_data[_("Strike ID")].append(strike_id)
            with contextlib.suppress(IndexError):
                strike_count = strike["count"]
                tabular_data[_("Strike Count")].append(strike_count)
            with contextlib.suppress(IndexError):
                recent_id = strike["most_recent_id"]
                tabular_data[_("Latest Strike Given (UTC)")].append(
                    discord.utils.snowflake_time(recent_id).strftime(
                        "%Y-%m-%d %H:%M"))
            with contextlib.suppress(IndexError):
                reason = strike["reason"]
                if reason:
                    reason = "\n".join(
                        pagify(reason,
                               delims=[" "],
                               page_length=25,
                               shorten_by=0))
                tabular_data[_("Reason")].append(reason)

        if tabular_data:
            return tabulate(tabular_data,
                            headers="keys",
                            tablefmt="fancy_grid",
                            numalign="left")
        else:
            return ""
Example #16
0
    async def construct(cls, discord_id: int, guild: discord.Guild):
        playerobj = cls()

        playerobj.data = await models.SRLNick.get_or_none(discord_user_id=discord_id)
        if playerobj.data is None:
            raise UnableToLookupUserException(f"Unable to pull nick data for {discord_id}")
        playerobj.discord_user = guild.get_member(int(discord_id))

        return playerobj
Example #17
0
 async def get_specific_announce_channel(
         self, guild: discord.Guild) -> Union[discord.TextChannel, None]:
     try:
         channel_id = await self.config.guild(guild).get_raw(
             self.rule_name, "rule_specific_announce")
         return guild.get_channel(channel_id)
     except KeyError:
         # not set, so is disabled
         return None
Example #18
0
def get_role_mention(guild: discord.Guild, event: dict):
    if event["mention"] is None:
        return None

    role = guild.get_role(int(event["mention"]))
    if role is None:
        return None

    return role.mention
Example #19
0
 def create_role_from_file(self, server: discord.Guild, role: discord.Role):
     role = server.create_role(
         name=role["name"],
         colour=discord.Colour(int(role["colour"], base=16)),
         permissions=discord.Permissions(role["perms"]),
         hoist=role["hoist"],
         mentionable=role["mentionable"],
         reason=role["reason"])
     return role
Example #20
0
def get_user_closest_to_name(guild: discord.Guild, name: str):
    members = guild.members
    member_names = []
    for i in members:
        member_names.append(i.display_name)
    closest = process.extractOne(name, member_names)
    if closest is None:
        return None
    return guild.get_member_named(closest[0])
Example #21
0
    def can_act(self, guild: discord.Guild, channel: discord.TextChannel,
                mod: discord.Member, target: Union[discord.Member,
                                                   discord.User]) -> bool:
        mod = guild.get_member(mod.id)
        target = guild.get_member(target.id)
        if mod == None or target == None: return False

        rid = self.bot.db.configs.get(guild.id, "mod_role")
        if rid != "":
            if int(rid) in [x.id for x in target.roles]: return False

        roles, channels = self.get_ignored_roles_channels(guild)
        if any(x in [i.id for i in target.roles] for x in roles): return False
        if channel.id in channels: return False

        return mod.id != target.id \
            and target.id != guild.owner.id \
            and (target.guild_permissions.kick_members == False or target.guild_permissions.kick_members == False)
Example #22
0
def get_user_from_mention(guild: discord.Guild, mention: str):
    # member_id = get_id_from_mention(mention)
    # member = guild.get_member(member_id)
    # return member
    member_id = get_numbers(mention)
    if member_id:
        return guild.get_member(member_id)
    else:
        return None
Example #23
0
 def get_lfc_settings(self, guild: discord.Guild):
     settings = dict()
     query = f'SELECT lfc FROM settings WHERE gid={guild.id};'
     settings['status'] = self.execute_query(query)[0] == True
     query = f'SELECT cid FROM lfc_channels WHERE gid={guild.id};'
     r = self.execute_query_many(query)
     settings['channels'] = [guild.get_channel(c[0]) for c in r]
     settings['role'] = self.get_lfc_role(guild)
     return settings
Example #24
0
	async def getlogchannel(self, guild: discord.Guild):
		results = await self.bot.dbquery('logchannel', 'channelid', 'guildid=' + str(guild.id))
		if len(results) < 1:
			return None
		try: 
			return guild.get_channel(int(results[0][0]))
		except: 
			await self.bot.dbexec("DELETE FROM logchannel WHERE guildid=" + str(guild.id))
			return None
Example #25
0
async def send_to_changelog(guild: Guild, message: Union[str, Embed]):
    channel: Optional[TextChannel] = guild.get_channel(await Settings.get(
        int, "logging_changelog", -1))
    if channel is not None:
        if isinstance(message, str):
            embed = Embed(colour=Colours.changelog, description=message)
        else:
            embed = message
        await channel.send(embed=embed)
Example #26
0
    async def _check_guild(self, guild: discord.Guild):
        member_ids: list = await self.config.guild(guild).nicknamed_member_ids()

        if len(member_ids) == 0:
            return
        else:
            member: discord.Member
            for member in [guild.get_member(id) for id in member_ids]:
                await self._check_member(member)
Example #27
0
    async def on_guild_remove(self, guild: discord.Guild) -> None:

        log.info(
            f'Left a guild. Name: {guild.name} | ID: {guild.id} | Owner: {guild.owner} | Members: {len(guild.members)}'
        )

        time = self.bot.utils.format_datetime(datetime=pendulum.now(tz='UTC'))
        embed = discord.Embed(
            colour=discord.Colour.gold(),
            title=f'Left a guild',
            description=
            f'`Name:` {guild.name}\n`ID:` {guild.id}\n`Owner:` {guild.owner}\n`Time:` {time}\n`Members:` {len(guild.members)}'
        )
        embed.set_thumbnail(url=str(
            guild.icon_url_as(
                format='gif' if guild.is_icon_animated() else 'png')))
        await self.bot.logging_webhook.send(
            embed=embed, avatar_url=guild.icon_url_as(format='png'))
Example #28
0
def get_role_from_payload(payload: discord.RawReactionActionEvent,
                          guild: discord.Guild) -> discord.Role:
    g = Guild.objects(guild_id=payload.guild_id).first()
    r = Role.objects(id__in=g.roles) \
        .filter(message_id=payload.message_id) \
        .filter(reaction=payload.emoji.name).first()
    if not r:
        return None
    return guild.get_role(r.role_id)
 async def get_tournament_role(self, guild: discord.Guild) -> discord.Role:
     # no cache for this one
     role_id = await self.data.guild(guild).roles.tournament()
     if not role_id:
         raise UserInputError("Le rôle de tournois n'est pas réglé.")
     role = guild.get_role(role_id)
     if not role:
         raise UserInputError("Le rôle de tournois a été perdu.")
     return role
Example #30
0
    async def update_bulletin_message(self, guild: discord.Guild,
                                      channel: discord.TextChannel,
                                      message_id: int):
        """
        Modifies the bulletin message ID for a guild.
        """
        guild = await self.get_or_create_guild(guild)

        async with threadpool():
            with self.get_session() as sess:
                if channel is None:
                    guild.bulletin_channel = None
                else:
                    guild.bulletin_channel = channel.id
                guild.bulletin_message = message_id
                sess.add(guild)

        return guild
Example #31
0
 async def on_guild_join(self, guild: discord.Guild):
     logger.info(
         f"We have been added to a new guild! Hi: f{guild.id}: f{guild.name}"
     )
     try:
         guild = db.Guild[str(guild.id)]
         guild.disabled = False
     except ObjectNotFound:
         db.upsert_guild(str(guild.id), guild.name)
Example #32
0
    async def send_report(self, msg: discord.Message, guild: discord.Guild):

        author = guild.get_member(msg.author.id)
        report = msg.clean_content

        channel_id = await self.config.guild(guild).output_channel()
        channel = guild.get_channel(channel_id)
        if channel is None:
            return None

        files: List[discord.File] = await Tunnel.files_from_attatch(msg)

        ticket_number = await self.config.guild(guild).next_ticket()
        await self.config.guild(guild).next_ticket.set(ticket_number + 1)

        if await self.bot.embed_requested(channel, author):
            em = discord.Embed(description=report)
            em.set_author(
                name=_("Report from {author}{maybe_nick}").format(
                    author=author, maybe_nick=(f" ({author.nick})" if author.nick else "")
                ),
                icon_url=author.avatar_url,
            )
            em.set_footer(text=_("Report #{}").format(ticket_number))
            send_content = None
        else:
            em = None
            send_content = _("Report from {author.mention} (Ticket #{number})").format(
                author=author, number=ticket_number
            )
            send_content += "\n" + report

        try:
            await Tunnel.message_forwarder(
                destination=channel, content=send_content, embed=em, files=files
            )
        except (discord.Forbidden, discord.HTTPException):
            return None

        await self.config.custom("REPORT", guild.id, ticket_number).report.set(
            {"user_id": author.id, "report": report}
        )
        return ticket_number
Example #33
0
    async def _get_announce_channel(self, guild: discord.Guild) -> discord.TextChannel:
        channel_id = await self.config.guild(guild).announce_channel()
        channel = None

        if channel_id is not None:
            channel = guild.get_channel(channel_id)

        if channel is None:
            channel = guild.system_channel

        if channel is None:
            channel = guild.text_channels[0]

        return channel
Example #34
0
File: coins.py Project: lkmnds/jose
    async def ranks(self, user_id: int, guild: discord.Guild) -> tuple:
        """Get ranking data about a user."""
        all_accounts = await self.all_accounts()

        all_ids = [account['id'] for account in all_accounts]

        guild_ids = [account['id'] for account in all_accounts if
                     guild.get_member(account['id']) is not None]

        try:
            guildrank = guild_ids.index(user_id) + 1
        except ValueError:
            guildrank = -20

        globalrank = all_ids.index(user_id) + 1

        return guildrank, globalrank, len(guild_ids), len(all_ids)
Example #35
-1
    async def get_audit_entry(guild: discord.Guild, action: discord.AuditLogAction,
                              target: Any = None) -> Optional[discord.AuditLogEntry]:
        """Gets an audit log entry of the specified action type.

        The type of the action depends on the action.

        :param guild: The guild where the audit log will be checked.
        :param action: The action to filter.
        :param target: The target to filter.
        :return: The first matching audit log entry if found.
        """
        if not guild.me.guild_permissions.view_audit_log:
            return
        now = dt.datetime.utcnow()
        after = now - dt.timedelta(0, 5)
        async for entry in guild.audit_logs(limit=10, oldest_first=False, action=action, after=after):
            if abs((entry.created_at - now)) >= dt.timedelta(seconds=5):
                break
            if target is not None and entry.target.id == target.id:
                return entry