def name(member : discord.Member):
# A helper function to return the member's display name
nick = name = None
try:
nick = member.nick
except AttributeError:
pass
try:
name = member.name
except AttributeError:
pass
if nick:
return nick
if name:
return name
return None
python类Member()的实例源码
def recheckrole(self, ctx, *, user : discord.Member = None):
"""Re-iterate through all members and assign the proper roles based on their xp (admin only)."""
author = ctx.message.author
server = ctx.message.server
channel = ctx.message.channel
isAdmin = author.permissions_in(channel).administrator
# Only allow admins to change server stats
if not isAdmin:
await self.bot.send_message(channel, 'You do not have sufficient privileges to access this command.')
return
if not user:
user = author
# Now we check for promotions
if await CheckRoles.checkroles(user, channel, self.settings, self.bot):
await self.bot.send_message(channel, 'Done checking roles.\n\n*{}* was updated.'.format(DisplayName.name(user)))
else:
await self.bot.send_message(channel, 'Done checking roles.\n\n*{}* was not updated.'.format(DisplayName.name(user)))
def addmeme(ctx, *args, member: discord.Member = None):
if member is None:
member = ctx.message.author
if args:
if 'youtu' in args[0] or 'gfycat' in args[0] or 'imgur' in args[0] or 'streamable' in args[0] or 'redd' in args[0]:
cur.execute("SELECT status FROM links WHERE link = ?", (args[0],))
check = cur.fetchone()
if check is None:
cur.execute("INSERT INTO links (link, status, submitter_id, submitter_name) VALUES (?, 'review', ?, ?)", (args[0], member.id, member.name))
conn.commit()
cur.execute("SELECT count(*) FROM links WHERE status = 'review'")
count = cur.fetchone()[0]
if count == 1:
await yeebot.send_message(yeebot.get_channel(review_channel_id), 'There is 1 link awaiting review.'.format(count))
else:
await yeebot.send_message(yeebot.get_channel(review_channel_id), 'There are {} links awaiting review.'.format(count))
await yeebot.delete_message(ctx.message)
return await yeebot.say("`{}` has been submitted for review.".format(args[0]))
else:
return await yeebot.say("Sorry, that link has already been submitted. It is currently in status: `{}`".format(check[0]))
else:
return await yeebot.say("Please only submit links from Youtube, gfycat, streamable, or imgur.")
else:
return await yeebot.say("Please use the format: `!addmeme https://link.to.meme/meme`")
def review(ctx, amount=1, member: discord.Member = None):
if member is None:
member = ctx.message.author
if ctx.message.channel.id == review_channel_id:
if amount < 1 or amount > 5:
return await yeebot.say("Please use the format `!review <1-5>`.")
elif amount > 1 and amount < 6:
cur.execute("SELECT link, submitter_name FROM links WHERE status = 'review' LIMIT ?", (amount, ))
links = cur.fetchall()
if links:
for row in links:
await yeebot.say("Submitted by: {}, `{}`".format(row[1], row[0]))
else:
return await yeebot.say("No links to review.")
else:
cur.execute("SELECT link, submitter_name FROM links WHERE status = 'review' LIMIT ?", (amount, ))
links = cur.fetchall()
if links:
for row in links:
await yeebot.say("Submitted by: {}, {}".format(row[1], row[0]))
else:
return await yeebot.say("No links to review.")
else:
return await yeebot.say("You do not have permission to execute this command.")
def give(self, ctx, user: discord.Member, cookies: int):
"""Gives another user your cookies"""
author = ctx.message.author
settings = self.check_server_settings(author.server)
if user.bot:
return await self.bot.say("Nice try, us bots can't accept cookies from strangers.")
if author.id == user.id:
return await self.bot.say("You can't give yourself cookies.")
self.account_check(settings, author)
self.account_check(settings, user)
sender_cookies = settings["Players"][author.id]["Cookies"]
if 0 < cookies <= sender_cookies:
settings["Players"][author.id]["Cookies"] -= cookies
settings["Players"][user.id]["Cookies"] += cookies
dataIO.save_json(self.file_path, self.system)
msg = "You gave **{}** cookies to {}".format(cookies, user.name)
else:
msg = "You don't have enough cookies in your account"
await self.bot.say(msg)
def steal(self, ctx, user: discord.Member=None):
"""Steal cookies from another user. 2h cooldown."""
author = ctx.message.author
server = author.server
action = "Steal CD"
settings = self.check_server_settings(author.server)
self.account_check(settings, author)
if user is None:
user = self.random_user(settings, author, server)
if user == "Fail":
pass
elif user.bot:
return await self.bot.say("Stealing failed because the picked target is a bot.\nYou "
"can retry stealing again, your cooldown is not consumed.")
if await self.check_cooldowns(author.id, action, settings):
msg = self.steal_logic(settings, user, author)
await self.bot.say("?(=(|) ? (|)=)? Neko-chan is on the prowl to steal :cookie:")
await asyncio.sleep(4)
await self.bot.say(msg)
def check_server_settings(self, server):
if server.id not in self.system["Servers"]:
self.system["Servers"][server.id] = {"Shop List": {},
"Users": {},
"Pending": {},
"Config": {"Shop Name": "Jumpman's",
"Shop Open": True,
"Shop Notify": False,
"Shop Role": None,
"Trade Cooldown": 30,
"Store Output Method": "Chat",
"Inventory Output Method": "Chat",
"Sort Method": "Alphabet",
"Member Discount": None,
"Pending Type": "Manual"}
}
dataIO.save_json(self.file_path, self.system)
print("Creating default Shop settings for Server: {}".format(server.name))
path = self.system["Servers"][server.id]
return path
else:
path = self.system["Servers"][server.id]
if "Shop Role" not in path["Config"]:
path["Config"]["Shop Role"] = None
return path
def _removeuser_casino(self, ctx, user: discord.Member):
"""Remove a user from casino"""
author = ctx.message.author
super().check_server_settings(author.server)
if not super().membership_exists(user):
msg = _("This user is not a member of the casino.")
else:
await self.bot.say(_("Are you sure you want to remove player data for {}? Type {} to "
"confirm.").format(user.name, user.name))
response = await self.bot.wait_for_message(timeout=15, author=author)
if response is None:
msg = _("No response. Player removal cancelled.")
elif response.content.title() == user.name:
super().remove_membership(user)
msg = _("{}\'s casino data has been removed by {}.").format(user.name, author.name)
else:
msg = _("Incorrect name. Cancelling player removal.")
await self.bot.say(msg)
def _balance_setcasino(self, ctx, user: discord.Member, chips: int):
"""Sets a Casino member's chip balance"""
author = ctx.message.author
settings = super().check_server_settings(author.server)
chip_name = settings["System Config"]["Chip Name"]
casino_name = settings["System Config"]["Casino Name"]
try:
super().set_chips(user, chips)
except NegativeChips:
return await self.bot.say(_("Chips must be higher than 0."))
except UserNotRegistered:
return await self.bot.say(_("You need to register to the {} Casino. To register type "
"`{}casino join`.").format(casino_name, ctx.prefix))
else:
logger.info("SETTINGS CHANGED {}({}) set {}({}) chip balance to "
"{}".format(author.name, author.id, user.name, user.id, chips))
await self.bot.say(_("```Python\nSetting the chip balance of {} to "
"{} {} chips.```").format(user.name, chips, chip_name))
def spam(self, ctx, user : discord.Member, spamtext, number : int=0):
"""Spams x times, default is 4."""
if user.id == "96987941519237120":
await self.bot.say("Hell nah, I ain't spamming him.")
return
if user.id == settings.owner:
await self.bot.say("Hell nah, I ain't spamming him. If you want to spam my owner use the `suggest` command!")
return
if number >> 8:
await self.bot.say("Hell nah, not past 8 for fck sakes.")
return
if number == 0:
number = 4
counter = 0
while counter < number:
try:
await self.bot.send_message(user, "{}, sent by **{}**".format(spamtext, ctx.message.author))
except discord.Forbidden:
await self.bot.say("{} blocked me :sob:".format(user.mention))
return
counter = counter + 1
if counter == 1:
await self.bot.say("Hehe, {} got spammed {} time!".format(user.mention, counter))
else:
await self.bot.say("Hehe, {} got spammed {} time!".format(user.mention, counter))
def user_is_registered(self, user):
"""Checks whether a ?User? is registered in the database.
Parameters
----------
user
Can be a Discord `User` object or `Member` object, or a user ID.
"""
if isinstance(user, discord.User) or isinstance(user, discord.Member):
try:
get_user_model().objects.get(id=user.id)
return True
except get_user_model().DoesNotExist:
return False
else:
try:
get_user_model().objects.get(id=user)
return True
except get_user_model().DoesNotExist:
return False
def get_member(self, member=None, user=None, guild=None):
"""Retrieves a Dwarf ?Member? object from the database.
Either ?member? or both ?user? and ?guild? must be given as arguments.
Parameters
----------
member : Optional
Has to be a Discord ?Member? object.
user : Optional
Can be a Discord `User` object or a user ID.
guild : Optional
Can be a Discord ?Server? object or a guild ID.
"""
if isinstance(member, discord.Member):
user_id = member.id
guild_id = member.server.id
else:
if user is None or guild is None:
raise ValueError("Either a Member object or both user ID "
"and guild ID must be given as argument(s).")
if isinstance(user, discord.User):
user_id = user.id
else:
user_id = user
if isinstance(guild, discord.Server):
guild_id = guild.id
else:
guild_id = guild
return Member.objects.get(user=user_id, guild=guild_id)
def on_member_join(self, member):
"""Automatically assign roles if guild has a role set through `newrole` command."""
if not member.guild.me.guild_permissions.manage_roles:
return
async with self.bot.db_pool.acquire() as con:
role_id = await con.fetchval('''
SELECT role_id FROM newrole WHERE guild_id = $1
''', member.guild.id)
if role_id is None:
return
role = discord.utils.get(member.guild.roles, id=role_id)
if role is None:
async with con.transaction():
await con.execute('''
DELETE FROM newrole WHERE guild_id = $1
''', member.guild.id)
return
await member.add_roles(role, reason='New Member')
def has_role(member: discord.Member, role_id: str):
""" Checks if a member has a role with a specified ID.
:param member: The member to check.
:type member: discord.Member
:param role_id: The ID of the role to check for.
:type role_id: str
:return: True if the member has a role with the given ID, false otherwise
"""
for role in member.roles:
if role.id == role_id:
return True
return False
def spoof(self, member: discord.Member, channel: discord.Channel):
""" Spoofs a channel ID if there's a set channel to spoof from
the one where the command was executed. Also checks for the
author's permissions to see if they can spoof commands.
:param member: The member trying to spoof the command.
:type member: discord.Member
:param channel: The channel from which the command to spoof was sent.
:type channel: discord.Channel
:return: If there's a registered ID to spoof and the author has elevated
permissions, returns the spoofed ID. If not, returns the same ID
as channel_id
"""
if self.has_permission(member) and self.get_interface(channel).spoofed\
is not None:
return self._interfaces[channel].spoofed
return channel
def clear(self, ctx: commands.Context, number: int, member: discord.Member = None) -> None:
"""
Purges messages from the channel
:param ctx: The message context
:param number: The number of messages to purge
:param member: The member whose messages will be cleared
"""
if number < 1:
await command_error(ctx, "You must attempt to purge at least 1 message!")
return
def predicate(msg: discord.Message) -> bool:
return msg == ctx.message or member is None or msg.author == member
if number <= 100:
# Add 1 to limit to include command message, subtract 1 from the return to not count it.
msgs = await self.bot.purge_from(ctx.message.channel, limit=number + 1, check=predicate)
send(self.bot, '{} message{} cleared.'.format(len(msgs) - 1, "s" if len(msgs) - 1 != 1 else ""),
ctx.message.channel, True)
else:
await command_error(ctx, 'Cannot delete more than 100 messages at a time.')
def joino(self, ctx, user : discord.Member):
"""Forces another person to join the ranking system"""
if not user:
if user.id not in self.leader_board:
self.leader_board[user.id] = {"name": user.name, "rank": 0, "XP": 0}
dataIO.save_json("data/levels/leader_board.json", self.leader_board)
await self.bot.say("{} has joined the Levelboard!".format(user.mention))
else:
await self.bot.say("{} has already joined and is rank {}".format(user.mention, str(self.get_rank(user.id))))
else:
if user.id not in self.leader_board:
self.leader_board[user.id] = {"name": user.name, "rank": 0, "XP": 0}
dataIO.save_json("data/levels/leader_board.json", self.leader_board)
await self.bot.say("{} has joined the Levelboard!".format(user.mention))
else:
await self.bot.say("{} has already joined and is rank {}".format(user.mention, str(self.get_rank(user.id))))
def _stats(self, ctx, user : discord.Member=None):
"""Show rank and XP of users.
Defaults to yours."""
if not user:
user = ctx.message.author
if self.check_joined(user.id):
await self.bot.say("{}'s stats: **Wins: {} | Losses: {} | Ties: {} **".format(user.name, self.get_wins(user.id),
self.get_losses(user.id),
self.get_ties(user.id)))
else:
await self.bot.say("{}, you are not yet in the tournament!".format(user.mention))
else:
if self.check_joined(user.id):
await self.bot.say("{}'s stats: **Wins: {} | Losses: {} | Ties: {} **".format(user.name, self.get_wins(user.id),
self.get_losses(user.id),
self.get_ties(user.id)))
else:
await self.bot.say("This user has not joined the tournament")
def sfp(self, ctx, user: discord.Member=None):
"""Super Falcon Punch"""
author = ctx.message.author
if not user:
await self.bot.say("{} has Super Falcon Punched!".format(author.mention))
with aiohttp.ClientSession() as session:
async with session.get("https://cdn.discordapp.com/attachments/172354611477348352/193299243539234817/imgres.jpg") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.png", "wb") as f:
f.write(test)
await self.bot.upload("data/commands/Images/imgres.png")
else:
await self.bot.say("{} has Super Falcon Punched {} and blew him away!".format(author.mention, user.mention))
with aiohttp.ClientSession() as session:
async with session.get("https://cdn.discordapp.com/attachments/172354611477348352/193299243539234817/imgres.jpg") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.png", "wb") as f:
f.write(test)
await self.bot.upload("data/commands/Images/imgres.png")
def suckmydonut(self, ctx, user : discord.Member = None):
"""Suck My Donuts Beeyatch!"""
author = ctx.message.author
if not user:
with aiohttp.ClientSession() as session:
async with session.get("http://owned.com/media/_cache/adjusted/postblock/image/4/6/7/2/4672.jpg.png") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.png", "wb") as f:
f.write(test)
await self.bot.say("{} says to:".format(author.mention))
await self.bot.upload("data/commands/Images/imgres.png")
else:
with aiohttp.ClientSession() as session:
async with session.get("http://owned.com/media/_cache/adjusted/postblock/image/4/6/7/2/4672.jpg.png") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.png", "wb") as f:
f.write(test)
await self.bot.say("{} tells {} to:".format(author.mention, user.mention))
await self.bot.upload("data/commands/Images/imgres.png")
def spank(self, ctx, user : discord.Member = None):
"""Spank"""
author = ctx.message.author
if not user:
with aiohttp.ClientSession() as session:
async with session.get("https://images-ext-1.discordapp.net/eyJ1cmwiOiJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hdHRhY2htZW50cy8xMDc5NDI2NTIyNzU2MDE0MDgvMTA3OTQ1MDg3MzUwMDc5NDg4L1R1SEdKLmdpZiJ9.-XeFHSFOR0nv53M34HeUBqQc7Wc.gif") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.gif", "wb") as f:
f.write(test)
await self.bot.say("{} spanked someone! :scream:".format(author.mention))
await self.bot.upload("data/commands/Images/imgres.gif")
else:
with aiohttp.ClientSession() as session:
async with session.get("https://images-ext-1.discordapp.net/eyJ1cmwiOiJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hdHRhY2htZW50cy8xMDc5NDI2NTIyNzU2MDE0MDgvMTA3OTQ1MDg3MzUwMDc5NDg4L1R1SEdKLmdpZiJ9.-XeFHSFOR0nv53M34HeUBqQc7Wc.gif") as resp:
test = await resp.read()
with open("data/commands/Images/imgres.gif", "wb") as f:
f.write(test)
await self.bot.say("{} spanked {}! :scream:".format(author.mention, user.mention))
await self.bot.upload("data/commands/Images/imgres.gif")
def get_scales(member: discord.Member):
# Query Database
with db.cursor() as cursor:
sql = "SELECT `total` FROM scales WHERE `username` = %s"
print(str(member))
cursor.execute(sql, (str(member),))
entry = cursor.fetchone()
cursor.close()
# Return the Number of Scales
if entry['total'] is not None:
return entry['total']
else:
return 0
# Add Scales to User's Total
def get_roles(member: discord.Member):
"""Lists a User's Roles"""
total = 0
role_list = ''
for role in member.roles:
if total > 0:
role_list += ', '
role_list += str(role)
total += 1
await bot.say('{0.name} is a member of these roles: '.format(member) + role_list)
# COMMAND: !get_channel_id
def member(self, ctx, member : discord.Member = None):
"""Retrieves information about a member of the guild."""
async with ctx.typing():
member = member or ctx.author
icon_url = member.avatar_url_as(static_format='png')
e = discord.Embed(type='rich', color=member.color)
e.set_thumbnail(url=icon_url)
e.add_field(name='Name', value=str(member))
e.add_field(name='ID', value=member.id)
e.add_field(name='Nickname', value=member.nick)
e.add_field(name='Bot Created' if member.bot else 'User Joined Discord', value=member.created_at.strftime(datetime_format))
e.add_field(name='Joined Guild', value=member.joined_at.strftime(datetime_format))
e.add_field(name='Color', value=str(member.color).upper())
e.add_field(name='Status and Game', value='%s, playing %s' % (str(member.status).title(), member.game), inline=False)
roles = sorted(member.roles)[1:] # Remove @everyone
roles.reverse()
e.add_field(name='Roles', value=', '.join(role.name for role in roles) or 'None', inline=False)
e.add_field(name='Icon URL', value=icon_url, inline=False)
await ctx.send(embed=e)
def displayname(self, member : discord.Member):
# A helper function to return the member's display name
nick = name = None
try:
nick = member.nick
except AttributeError:
pass
try:
name = member.name
except AttributeError:
pass
if nick:
return nick
if name:
return name
return None
def mine(self, ctx, *, user: discord.Member):
"""Set a tripmine for someone. Tripmines go off at random.
* user - The person for which the mine will go off.
"""
if user.id == ctx.bot.user.id:
await ctx.send("Nope. :3")
elif (ctx.channel.id in self.tripmines.keys() and
self.tripmines[ctx.channel.id].has_member(user.id)):
raise commands.UserInputError(f"A tripmine is already set for {user.display_name}.")
else:
self.tripmines.setdefault(ctx.channel.id, TripmineChannelArray())
self.tripmines[ctx.channel.id].add_member(user.id)
message = await ctx.send(f"Tripmine set for {user.display_name}! :3")
await asyncio.sleep(3)
await message.delete()
def unmine(self, ctx, *, user: discord.Member):
"""Remove a tripmine from yourself, or from someone else.
* user - The person for which the mine will go off.
"""
if not user:
user = ctx.author
if user.id == ctx.bot.user.id:
await ctx.send("Nope. :3")
elif (ctx.channel.id in self.tripmines.keys() and
self.tripmines[ctx.channel.id].has_member(user.id)):
self.tripmines[ctx.channel.id].remove_member(user.id)
await ctx.send(f"Removed tripmine for {user.display_name}! :3")
else:
raise commands.UserInputError(f"No tripmine is currently set for {user.display_name}.")
def plonk(self, ctx, *, member: discord.Member):
"""Bans a user from using the bot.
This bans a person from using the bot in the current server.
There is no concept of a global ban. This ban can be bypassed
by having the Manage Server permission.
To use this command you must have the Manage Server permission
or have a Bot Admin role.
"""
plonks = self.config.get('plonks', {})
guild_id = ctx.message.server.id
db = plonks.get(guild_id, [])
if member.id in db:
await self.bot.responses.failure(message='That user is already bot banned in this server.')
return
db.append(member.id)
plonks[guild_id] = db
await self.config.put('plonks', plonks)
await self.bot.responses.success(message='%s has been banned from using the bot in this server.' % member)
def unplonk(self, ctx, *, member: discord.Member):
"""Unbans a user from using the bot.
To use this command you must have the Manage Server permission
or have a Bot Admin role.
"""
plonks = self.config.get('plonks', {})
guild_id = ctx.message.server.id
db = plonks.get(guild_id, [])
try:
db.remove(member.id)
except ValueError:
await self.bot.responses.failure(message='%s is not banned from using the bot in this server.' % member)
else:
plonks[guild_id] = db
await self.config.put('plonks', plonks)
await self.bot.responses.success(message='%s has been unbanned from using the bot in this server.' % member)
def protect_common(self, obj, protect=True):
if not isinstance(obj, (discord.Member, discord.Role)):
raise TypeError('Can only pass member or role objects.')
server = obj.server
id = ('r' if type(obj) is discord.Role else '') + obj.id
protected = self.duelists.get(server.id, {}).get("protected", [])
if protect == (id in protected):
return False
elif protect:
protected.append(id)
else:
protected.remove(id)
if server.id not in self.duelists:
self.duelists[server.id] = {}
self.duelists[server.id]['protected'] = protected
dataIO.save_json(JSON_PATH, self.duelists)
return True