Ejemplo n.º 1
0
 async def match_player(self,
                        player,
                        guild: discord.Guild,
                        prompt=False,
                        ctx=None,
                        score_cutoff=20,
                        claim=True):
     matches = fuzzy.extract_matches(player.name,
                                     [n.name for n in guild.members],
                                     score_cutoff=score_cutoff,
                                     scorer=fuzzy.partial_ratio,
                                     limit=9)
     if len(matches) == 0:
         return None
     if len(matches) == 1:
         user = guild.get_member_named(matches[0][0])
         if prompt:
             m = await ctx.prompt(
                 f'[auto-claim]: {player.name} ({player.tag}) '
                 f'to be claimed to {str(user)} ({user.id}). '
                 f'If already claimed, this will do nothing.')
             if m is True and claim is True:
                 query = "UPDATE players SET user_id = $1 " \
                         "WHERE player_tag = $2 AND user_id IS NULL AND season_id = $3"
                 await self.bot.pool.execute(
                     query, user.id, player.tag, await
                     self.bot.seasonconfig.get_season_id())
             else:
                 return False
         return user
     return [guild.get_member_named(n[0]) for n in matches]
Ejemplo n.º 2
0
def getDiscordMemberFromString(
        _cls: "PhaazebotDiscord",
        Guild: discord.Guild,
        search: Union[str, int],
        Message: Optional[discord.Message] = None) -> Optional[discord.Member]:
    """
	Tries to get a member from a guild, the search input may be,
	the user name or his id.
	Returns first match, else None

	Also can take Message mentions in account if Message given
	"""

    # mention
    if Message:
        if Message.mentions:
            return Message.mentions[0]

    search: str = str(search)
    Member: Optional[discord.Member]

    # id
    if search.isdigit():
        Member = Guild.get_member(int(search))
        if Member: return Member

    # name
    Member = Guild.get_member_named(search)
    if Member:
        return Member

    return Member
Ejemplo n.º 3
0
def getMemberFromRef(uRef: str, dcGuild: Guild) -> Union[Member, None]:
    """Attempt to find a member of a given discord guild object from a string or integer.
    uRef can be one of:
    - A user mention <@123456> or <@!123456>
    - A user ID 123456
    - A user name Carl
    - A user name and discriminator Carl#0324

    If the passed user reference is none of the above, or a matching user cannot be found in the requested guild,
    None is returned.

    :param str uRef: A string or integer indentifying a user within dcGuild either by mention, ID, name,
                    or name and discriminator
    :param discord.Guild dcGuild: A discord.guild in which to search for a member matching uRef
    :return: Either discord.member of a member belonging to dcGuild and matching uRef, or None if uRef is invalid
                or no matching user could be found
    :rtype: discord.Member or None
    """
    # Handle user mentions
    if stringTyping.isMention(uRef):
        return dcGuild.get_member(int(uRef.lstrip("<@!").rstrip(">")))
    # Handle IDs
    elif stringTyping.isInt(uRef):
        userAttempt = dcGuild.get_member(int(uRef))
        # handle the case where uRef may be the username (without discrim) of a user whose name consists only of digits.
        if userAttempt is not None:
            return userAttempt
    # Handle user names and user name+discrim combinations
    return dcGuild.get_member_named(uRef)
Ejemplo n.º 4
0
def getDiscordMemberFromString(cls:"PhaazebotDiscord", Guild:discord.Guild, search:str or int, Message:discord.Message=None) -> discord.Member or None:
	"""
		Tryes to get a member from a guild, the search input may be,
		the user name or his id, else None is given

		Also can take Message mentions in account if Message given
	"""

	# mention
	if Message:
		if Message.mentions:
			return Message.mentions[0]

	search:str = str(search)
	Member:discord.Member = None

	# id
	if search.isdigit():
		Member = Guild.get_member(int(search))
		if Member: return Member

	# name
	Member = Guild.get_member_named(search)
	if Member:
		return Member
Ejemplo n.º 5
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])
Ejemplo n.º 6
0
    async def construct_discord_name(cls, discord_name: str,
                                     guild: discord.Guild):
        playerobj = cls()

        playerobj.discord_user = guild.get_member_named(discord_name)
        if playerobj.discord_user is None:
            raise UnableToLookupUserException(
                f"Unable to lookup player {discord_name}")

        return playerobj
Ejemplo n.º 7
0
    async def construct_discord_name(cls, discord_name: str, guild: discord.Guild):
        playerobj = cls()

        playerobj.discord_user = guild.get_member_named(discord_name)
        if playerobj.discord_user is None:
            raise UnableToLookupUserException(f"Unable to lookup player {discord_name}")
        playerobj.data = await models.SRLNick.get_or_none(discord_user_id=playerobj.discord_user.id)
        if playerobj.data is None:
            raise UnableToLookupUserException(f"Unable to pull nick data for {discord_name}")

        return playerobj
Ejemplo n.º 8
0
    def get_user_and_intensity(self, guild: discord.Guild, target: str):
        target = target.strip()
        user = None
        intensity = 1
        # mentions can be <@! or <@
        user_ment = mention.match(target)
        user_ment_b = mention_bang.match(target)

        # try with no intensity specified and not a mention
        if not user_ment or not user_ment_b:
            user = guild.get_member_named(target)

        # has intensity, could be a mention/text
        if not user:
            try:
                args = target.split()
                intensity = int(args[-1])
                name = " ".join(args[:-1])
                # not a mention
                user = guild.get_member_named(name)
                # parse mention
                if not user:
                    user_ment = mention.match(name)
                    user_ment_b = mention_bang.match(name)
            except:
                pass

        if not user:
            if user_ment:
                user = guild.get_member(int(user_ment.group(1)))
            elif user_ment_b:
                user = guild.get_member(int(user_ment_b.group(1)))
            else:
                user = None

        return user, intensity
Ejemplo n.º 9
0
async def get_member(guild: discord.Guild, argument: str) -> discord.Member:
    match = re.match(r'([0-9]{15,21})$', argument) or re.match(
        r'<@!?([0-9]+)>$', argument)
    if match is None:
        # not a mention...
        if guild:
            result = guild.get_member_named(argument)
        else:
            result = _get_from_guilds(bot, 'get_member_named', argument)
    else:
        user_id = int(match.group(1))
        if guild:
            result = guild.get_member(user_id)
        else:
            result = _get_from_guilds(bot, 'get_member', user_id)

    return result
Ejemplo n.º 10
0
def get_user_id_from_arbitrary_str(guild: discord.Guild, string: str):
    if string.isnumeric():
        potential_uid = int(string)
    elif string.startswith("<@") and string.endswith(">"):
        potential_uid = int(
            string.replace("<@", "").replace(">", "").replace("!", ""))
    else:
        potential_user = guild.get_member_named(string)

        if potential_user is None:
            raise ValueError(f"No member by the name of {string} was found.")

        return potential_user.id

    # if guild.get_member(potential_uid) is None:
    #    raise ValueError("Member ID {} (translated from {}) was not found. ".format(potential_uid, string))

    return potential_uid
    async def _resolve_member(
            candidate_guild: Guild,
            user_identifier: str) -> Tuple[Optional[Member], Optional[str]]:
        """
        Attempts to resolve a member object from the given user identifier. First attempts to resolve by username, then
        attempts to resolve as if user_identifier is a snowflake.

        :param candidate_guild: the guild to search for the given user in
        :param user_identifier: the identifier to attempt to resolve from
        :return: Returns a tuple of (Member, None) on success, (None, Error Message) on failure
        """
        try:
            user_obj = candidate_guild.get_member_named(user_identifier)
        except NotFound:
            user_obj = None
        try:
            user_snowflake = int(user_identifier)
            user_obj = candidate_guild.get_member(user_snowflake)
        except ValueError:
            pass
        if user_obj is None:
            return None, f'User {user_identifier} is not currently a Member!'
        return user_obj, None