async def weather(self, ctx, place: str = None): """Shows weather in provided place""" if place is None: place = config["hometown"] g = geocoder.google(place) if len(g.latlng) == 0: await self.bot.say("Cannot find a place `" + place + "`") return forecast = forecastio.load_forecast(self.apikey, g.latlng[0], g.latlng[1], units="si") by_hour = forecast.currently() place = g.city_long + " | " + xstr(g.country_long) content = "Weather in " + place \ + ":\n" + by_hour.summary + "\n" + str(by_hour.temperature) + \ "˚C" + "\n" + dictionary.get(xstr(by_hour.icon)) em = discord.Embed(description=content, colour=0xff0000, timestamp=by_hour.time) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say(content)
async def forecast(self, ctx, place: str = None): """Shows 7 days forecast for provided place""" if place is None: place = config["hometown"] g = geocoder.google(place) if len(g.latlng) == 0: await self.bot.say("Cannot find a place `" + place + "`") return forecast = forecastio.load_forecast(self.apikey, g.latlng[0], g.latlng[1], units="si") by_hour = forecast.daily() place = g.city_long + " | " + xstr(g.country_long) content = "Weather in " + place + ":\n" for i in range(0, 6): content = content + \ "__***" + by_hour.data[i].time.strftime("%d/%m") + ":***__ " + \ xstr(by_hour.data[i].temperatureMin) + " - " + \ xstr(by_hour.data[i].temperatureMax) + "˚C " \ + dictionary.get(xstr(by_hour.data[i].icon)) + "\n" em = discord.Embed(description=content, colour=0xff0000, timestamp=datetime.datetime.now()) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say(content)
async def channel(self, ctx, *, channel: discord.Channel): """Get info about channel""" changed_roles = [] for elem in channel.changed_roles: changed_roles.append(elem.name) em = discord.Embed(title=channel.name, description=channel.topic, colour=random.randint(0, 16777215)) em.add_field(name="ID", value=channel.id) em.add_field(name="Type", value=str(channel.type).replace("voice", "🔈").replace("text", "📰")) em.add_field(name="Has existed since", value=channel.created_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="Position", value=channel.position) em.add_field(name="Changed roles permissions", value="\n".join([str(x) for x in changed_roles]) or "`Not set`") em.add_field(name="Mention", value=channel.mention + "\n`" + channel.mention + "`") if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("```\n" + "Name: " + channel.name + "\nTopic: " + channel.topic + "\nID: " + channel.id + "\nType: " + channel.type.name + "\nHas existed since: " + channel.created_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\nPosition: " + str(channel.position) + "\nChanged roles permissions: " + "\n".join([str(x) for x in changed_roles]) + "\nMention: " + channel.mention + "```")
async def role(self, ctx, *, role: discord.Role): """Get info about role""" em = discord.Embed(title=role.name, colour=role.colour) em.add_field(name="ID", value=role.id) em.add_field(name="Perms", value="[" + str(role.permissions.value) + "](https://discordapi.com/permissions.html#" + str( role.permissions.value) + ")") em.add_field(name="Has existed since", value=role.created_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="Hoist", value=str(role.hoist) .replace("True", "✔") .replace("False", "❌")) em.add_field(name="Position", value=role.position) em.add_field(name="Color", value=role.colour) em.add_field(name="Managed", value=str(role.managed).replace("True", "✔").replace("False", "❌")) em.add_field(name="Mentionable", value=str(role.mentionable).replace("True", "✔").replace("False", "❌")) em.add_field(name="Mention", value=role.mention + "\n`" + role.mention + "`") em.set_thumbnail(url="https://xenforo.com/community/rgba.php?r=" + str(role.colour.r) + "&g=" + str( role.colour.g) + "&b=" + str(role.colour.b) + "&a=255") if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("```\n" + "ID: " + role.id + "\nPerms: " + str(role.permissions.value) + "\nHas existed since: " + role.created_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\nHoist: " + str(role.hoist).replace("True", "✔").replace("False", "❌") + "\nPosition: " + str(role.position) + "\nColor: " + str(cc.rgb_to_hex(cc.get_rgb_from_int(role.colour.value))) + "\nManaged: " + str(role.managed).replace("True", "✔").replace("False", "❌") + "\nMentionable: " + str(role.mentionable).replace("True", "✔").replace("False", "❌") + "\nMention: " + str(role.mention) + "```")
async def channels(self, ctx, server: str = None): """Get all channels on server""" if server is None: server = ctx.message.server else: server = discord.utils.get(self.bot.servers, id=server) if server is None: await self.bot.say("Failed to get server with provided ID") return vchans = [] tchans = [] for elem in server.channels: if str(elem.type) == "voice": vchans.append(elem.name) elif str(elem.type) == "text": tchans.append(elem.name) em = discord.Embed(title="Channels list", colour=random.randint(0, 16777215)) em.add_field(name="Text channels:", value="\n".join([str(x) for x in tchans]), inline=False) em.add_field(name="Voice channels:", value="\n".join([str(x) for x in vchans]), inline=False) em.set_footer(text="Total count of channels: " + str(len(server.channels)) + " | Text Channels: " + str(len(tchans)) + " | Voice Channels: " + str(len(vchans))) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("**Text channels:**\n```" + "\n".join([str(x) for x in tchans]) + "```**Voice channels:**\n```" + "\n".join([str(x) for x in vchans]) + "```\nTotal count: " + str(len(server.channels)) + " | Text Channels: " + str(len(tchans)) + " | Voice Channels: " + str(len(vchans)))
async def quote(self, ctx, messageid: str, *, response: str = None): """Quote an message by id""" message = discord.utils.get(self.bot.messages, id=messageid) if message is None: await self.bot.say("Failed to get message with id `" + messageid + "`") else: if message.channel.is_private: colour = discord.Colour.default() name = message.author.name else: colour = message.author.colour name = message.author.nick or message.author.name em = discord.Embed(description=message.content, colour=colour, timestamp=message.timestamp) em.set_author(name=name, icon_url=message.author.avatar_url) em.set_footer(text=message.author.name + "#" + message.author.discriminator) attachment = discord.utils.get(message.attachments) if attachment is not None: attachment = dict(attachment) em.set_image(url=attachment['url']) if Checks.embeds_allowed(ctx.message): await self.bot.say(response, embed=em) else: await self.bot.say((response or "") + "\n\n**Quote from " + message.author.name + "#" + message.author.discriminator + ":**\n```\n" + message.content + "```")
async def emoji(self, ctx, *, emoji: discord.Emoji): """Get info about emoji Works only with nonstandard emojis (non-unicode)""" allowed_roles = [] for elem in emoji.roles: allowed_roles.append(elem.name) em = discord.Embed(title=emoji.name, colour=random.randint(0, 16777215)) em.add_field(name="ID", value=emoji.id) em.add_field(name="Has existed since", value=emoji.created_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="\":\" required", value=str(emoji.require_colons).replace("True", "✔").replace( "False", "❌")) em.add_field(name="Managed", value=str(emoji.managed).replace("True", "✔").replace( "False", "❌")) em.add_field(name="Server", value=emoji.server) if len(allowed_roles) > 0: em.add_field(name="Roles", value="\n".join([str(x) for x in allowed_roles])) em.set_image(url=emoji.url) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say( "```\n" + "ID: " + emoji.id + "\nHas existed since: " + emoji.created_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\n\":\" required: " + str(emoji.require_colons).replace( "True", "✔").replace("False", "❌") + "\nManaged: " + str(emoji.managed).replace("True", "✔").replace("False", "❌") + "\nServer: " + str(emoji.server) + "\nRoles: " + "\n".join([str(x) for x in allowed_roles]) + "```" + emoji.url)
async def embed(self, ctx, *, message: str): """Says something via embed Useful for using emojis on any server without Nitro Inline code markdown at start and at end of message will be removed""" if not Checks.embeds_allowed(ctx.message): await self.bot.say( "Not allowed to send embeds here. Lack `Embed Links` permission" ) return message = re.sub(r'^\s*(`\s*)?|(\s*`)?\s*$', '', message) if ctx.message.server: em_color = ctx.message.author.colour else: em_color = discord.Colour.default() em = discord.Embed(description=message, colour=em_color) await self.bot.say(embed=em)
async def roles(self, ctx, server: str = None): """Get all roles on server""" if server is None: server = ctx.message.server else: server = discord.utils.get(self.bot.servers, id=server) if server is None: await self.bot.say("Failed to get server with provided ID") return roles = [] for elem in server.role_hierarchy: roles.append(elem.name) em = discord.Embed(title="List of roles", description="\n".join([str(x) for x in roles]), colour=random.randint(0, 16777215)) em.set_footer(text="Total count of roles: " + str(len(server.roles))) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("**List of roles:**\n```" + "\n".join([str(x) for x in roles]) + "```\nTotal count: " + str(len(server.roles)))
async def signed(self, ctx, *, message: str = None): """Says something with embedded signature Text changeable in config.json""" if not Checks.embeds_allowed(ctx.message): await self.bot.say( "Not allowed to send embeds here. Lack `Embed Links` permission" ) return em = discord.Embed(title=config["signature_title"], description=config["signature_desc"], url=config["signature_url"], colour=config["signature_colour"], timestamp=ctx.message.timestamp) em.add_field(name=config["signature_field_name"], value=config["signature_field_content"], inline=False) em.set_footer(text=ctx.message.author.nick or ctx.message.author.name, icon_url=ctx.message.author.avatar_url) await self.bot.say(message, embed=em)
async def info(self, ctx, member: discord.Member = None): """Information on a user""" if member is None: member = ctx.message.author roles = [x.name for x in member.roles if x.name != "@everyone"] # from Red-DiscordBot by TwentySix if roles: roles = sorted(roles, key=[x.name for x in ctx.message.server.role_hierarchy if x.name != "@everyone"].index) roles = "\n".join(roles) else: roles = "`None`" em = discord.Embed(title=member.nick, colour=member.colour) em.add_field(name="Name", value=member.name) em.add_field(name="Joined server", value=member.joined_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="ID", value=member.id) em.add_field(name="Has existed since", value=member.created_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="Color", value=member.colour) em.add_field(name="Bot?", value=str(member.bot).replace("True", "✔").replace("False", "❌")) em.add_field(name="Server perms", value="[" + str( member.server_permissions.value) + "](https://discordapi.com/permissions.html#" + str( member.server_permissions.value) + ")") em.add_field(name="Roles", value=roles, inline=False) em.set_image(url=member.avatar_url) em.set_thumbnail(url="https://xenforo.com/community/rgba.php?r=" + str(member.colour.r) + "&g=" + str( member.colour.g) + "&b=" + str(member.colour.b) + "&a=255") if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("```\n" + "Name: " + member.name + "\nJoined server: " + member.joined_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\nID: " + member.id + "\nHas existed since: " + member.created_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\nColor: " + str(member.color) + "\nBot?: " + str(member.bot).replace("True", "✔").replace("False", "❌") + "\nServer perms: " + str(member.server_permissions.value) + "\nRoles: " + roles + "```\n" + member.avatar_url)
async def color(self, ctx, color: str): """Shows some info about provided HEX color""" pattern = re.compile("^#([A-Fa-f0-9]{6})$") if pattern.match(color): colorrgb = cc.hex_to_rgb(color) colorint = cc.get_int_from_rgb(colorrgb) colorhsv = colorsys.rgb_to_hsv(colorrgb[0], colorrgb[1], colorrgb[2]) colorhls = colorsys.rgb_to_hls(colorrgb[0], colorrgb[1], colorrgb[2]) coloryiq = colorsys.rgb_to_yiq(colorrgb[0], colorrgb[1], colorrgb[2]) colorcmyk = cc.rgb_to_cmyk(colorrgb[0], colorrgb[1], colorrgb[2]) em = discord.Embed( title=str(color), description="Provided HEX: " + color + "\nRGB: " + str(colorrgb) + "\nCMYK: " + str(colorcmyk) + "\nHSV: " + str(colorhsv) + "\nHLS: " + str(colorhls) + "\nYIQ: " + str(coloryiq) + "\nint: " + str(colorint), url='http://www.colorpicker.com/' + str(color.lstrip('#')), colour=colorint, timestamp=ctx.message.timestamp) em.set_thumbnail(url="https://xenforo.com/community/rgba.php?r=" + str(colorrgb[0]) + "&g=" + str(colorrgb[1]) + "&b=" + str(colorrgb[2]) + "&a=255") if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("```\n" + "Provided HEX: " + color + "\nRGB: " + str(colorrgb) + "\nCMYK: " + str(colorcmyk) + "\nHSV: " + str(colorhsv) + "\nHLS: " + str(colorhls) + "\nYIQ: " + str(coloryiq) + "\nint: " + str(colorint) + "```") else: await self.bot.say( "Looks like the `{}`, that you provided is not color HEX\nOr it is too small/too big.\nExample of " "acceptable color HEX: `#1A2B3C`".format(color))
async def serverinfo(self, ctx, server: str = None): """Shows server information""" if server is None: server = ctx.message.server else: server = self.bot.get_server(server) if server is None: await self.bot.say("Failed to get server with provided ID") return afk = server.afk_timeout / 60 vip_regs = str("VIP_REGIONS" in server.features).replace("True", "✔").replace("False", "❌") van_url = str("VANITY_URL" in server.features).replace("True", "✔").replace("False", "❌") inv_splash = "INVITE_SPLASH" in server.features em = discord.Embed(title="Server info", colour=server.owner.colour) em.add_field(name="Name", value=server.name) em.add_field(name="Server ID", value=server.id) em.add_field(name="Region", value=server.region) em.add_field(name="Existed since", value=server.created_at.strftime('%d.%m.%Y %H:%M:%S %Z')) em.add_field(name="Owner", value=server.owner) em.add_field(name="AFK Timeout and Channel", value=str(afk) + " min in " + str(server.afk_channel)) em.add_field(name="Verification level", value=str(server.verification_level) .replace("none", "None") .replace("low", "Low") .replace("medium", "Medium") .replace("high", "(╯°□°)╯︵ ┻━┻")) em.add_field(name="2FA admins", value=str(server.mfa_level).replace("0", "❌").replace("1", "✔")) em.add_field(name="Member Count", value=server.member_count) em.add_field(name="Role Count", value=str(len(server.roles))) em.add_field(name="Channel Count", value=str(len(server.channels))) em.add_field(name="VIP Voice Regions", value=vip_regs) em.add_field(name="Vanity URL", value=van_url) if not inv_splash: em.add_field(name="Invite Splash", value="❌") elif server.splash_url == "": em.add_field(name="Invite Splash", value="✔") else: em.add_field(name="Invite Splash", value="✔ [🔗](" + server.splash_url + ")") em.set_image(url=server.icon_url) if Checks.embeds_allowed(ctx.message): await self.bot.say(embed=em) else: await self.bot.say("```\n" + "Name: " + server.name + "\nServer ID: " + server.id + "\nRegion: " + str(server.region) + "\nExisted since: " + server.created_at.strftime('%d.%m.%Y %H:%M:%S %Z') + "\nOwner: " + str(server.owner) + "\nAFK timeout and Channel: " + str(afk) + " min in " + str(server.afk_channel) + "\nVerification level: " + str(server.verification_level).replace("none", "None").replace("low", "Low") .replace("medium", "Medium").replace("high", "(╯°□°)╯︵ ┻━┻") + "\n2FA admins: " + str(server.mfa_level).replace("0", "❌").replace("1", "✔") + "\nMember Count: " + str(server.member_count) + "\nRole Count: " + str(len(server.roles)) + "\nChannel Count: " + str(len(server.channels)) + "\nVIP Voice Regions: " + vip_regs + "\nVanity URL: " + van_url + "\nInvite Splash: " + str(inv_splash).replace("True", "✔").replace("False", "❌") + "\nInvite Splash URL: " + server.splash_url + "```\n" + server.icon_url)