[V3] Cleanup

This commit is contained in:
aikaterna
2018-08-08 21:54:06 -07:00
parent aabe0cd6a5
commit be13d0f686
21 changed files with 431 additions and 175 deletions

View File

@@ -8,12 +8,8 @@ from redbot.core.bot import Red
class Away:
"""Le away cog"""
default_global_settings = {
"ign_servers": []
}
default_user_settings = {
"MESSAGE": False
}
default_global_settings = {"ign_servers": []}
default_user_settings = {"MESSAGE": False}
def __init__(self, bot: Red):
self.bot = bot
@@ -36,20 +32,30 @@ class Away:
test = await self._away.user(author).MESSAGE()
if test:
try:
avatar = author.avatar_url if author.avatar else author.default_avatar_url
avatar = (
author.avatar_url if author.avatar else author.default_avatar_url
)
if test:
em = discord.Embed(description=test, color=discord.Color.blue())
em.set_author(name='{} is currently away'.format(author.display_name), icon_url=avatar)
em.set_author(
name="{} is currently away".format(author.display_name),
icon_url=avatar,
)
else:
em = discord.Embed(color=discord.Color.blue())
em.set_author(name='{} is currently away'.format(author.display_name), icon_url=avatar)
em.set_author(
name="{} is currently away".format(author.display_name),
icon_url=avatar,
)
await message.channel.send(embed=em)
except:
if test:
msg = '{} is currently away and has set the following message: `{}`'.format(author.display_name, test)
msg = "{} is currently away and has set the following message: `{}`".format(
author.display_name, test
)
else:
msg = '{} is currently away'.format(author.display_name)
msg = "{} is currently away".format(author.display_name)
await message.channel.send(msg)
@commands.command(name="away")
@@ -59,14 +65,16 @@ class Away:
mess = await self._away.user(author).MESSAGE()
if mess:
await self._away.user(author).clear()
msg = 'You\'re now back.'
msg = "You're now back."
else:
length = len(str(message))
if length < 256 and length > 2:
await self._away.user(author).MESSAGE.set(' '.join(ctx.message.clean_content.split()[1:]))
await self._away.user(author).MESSAGE.set(
" ".join(ctx.message.clean_content.split()[1:])
)
else:
await self._away.user(author).MESSAGE.set(' ')
msg = 'You\'re now set as away.'
await self._away.user(author).MESSAGE.set(" ")
msg = "You're now set as away."
await ctx.send(msg)
@commands.command(name="toggleaway")
@@ -78,10 +86,10 @@ class Away:
guilds = await self._away.ign_servers()
guilds.remove(guild.id)
await self._away.ign_servers.set(guilds)
message = 'Not ignoring this guild anymore.'
message = "Not ignoring this guild anymore."
else:
guilds = await self._away.ign_servers()
guilds.append(guild.id)
await self._away.ign_servers.set(guilds)
message = 'Ignoring this guild.'
message = "Ignoring this guild."
await ctx.send(message)

View File

@@ -1,8 +1,9 @@
{
"author": [
"Axas and aikaterna"
"aikaterna",
"Axas"
],
"description": "Set and unset a user as being away.",
"description": "Set and unset a user as being away. Originally by Paddo.",
"short": "Away message toggle for users",
"tags": [
"away"

View File

@@ -27,10 +27,7 @@ class Blurplefy:
self.bot = bot
self.config = Config.get_conf(self, 2778931480, force_registration=True)
default_guild = {
"role_enabled": False,
"blurple_role": None
}
default_guild = {"role_enabled": False, "blurple_role": None}
self.config.register_guild(**default_guild)
self.session = aiohttp.ClientSession()
@@ -42,27 +39,30 @@ class Blurplefy:
"""Toggle a role award for having a blurple profile picture."""
blurple_role_id = await self.config.guild(ctx.guild).blurple_role()
if blurple_role_id is None:
await ctx.send('Enter the role name to award: it needs to be a valid, already existing role.')
await ctx.send(
"Enter the role name to award: it needs to be a valid, already existing role."
)
def check(m):
return m.author == ctx.author
try:
blurple_role = await ctx.bot.wait_for('message', timeout=15.0, check=check)
blurple_role = await ctx.bot.wait_for("message", timeout=15.0, check=check)
blurple_role_obj = discord.utils.get(ctx.guild.roles, name=blurple_role.content)
if blurple_role_obj is None:
return await ctx.send('No role with that name.')
await ctx.invoke(self.blurpleroleset, blurple_role_obj)
return await ctx.send("No role with that name.")
return await ctx.invoke(self.blurpleroleset, role_name=blurple_role_obj)
except asyncio.TimeoutError:
return await ctx.send('No role entered, try again later.')
return await ctx.send("No role entered, try again later.")
role_enabled = await self.config.guild(ctx.guild).role_enabled()
await self.config.guild(ctx.guild).role_enabled.set(not role_enabled)
if not role_enabled:
word = 'enabled'
word = "enabled"
else:
word = 'disabled'
await ctx.send('Blurple role awarding {}.'.format(word))
word = "disabled"
await ctx.send("Blurple role awarding {}.".format(word))
@commands.guild_only()
@commands.command()
@@ -72,15 +72,15 @@ class Blurplefy:
await self.config.guild(ctx.guild).blurple_role.set(role_name.id)
blurple_role_id = await self.config.guild(ctx.guild).blurple_role()
blurple_role_obj = discord.utils.get(ctx.guild.roles, id=blurple_role_id)
await ctx.send('Blurple award role set to: {}.'.format(blurple_role_obj.name))
await ctx.send("Blurple award role set to: {}.".format(blurple_role_obj.name))
blurple_role_enabled = await self.config.guild(ctx.guild).role_enabled()
if not blurple_role_enabled:
await ctx.invoke(self.blurplerole)
async def blurplefy(self, ctx, user: discord.Member=None):
async def blurplefy(self, ctx, user: discord.Member = None):
"""Blurplefy a user or image."""
picture = None
await ctx.send('{}, starting blurple image analysis.'.format(ctx.message.author.mention))
await ctx.send("{}, starting blurple image analysis.".format(ctx.message.author.mention))
link = ctx.message.attachments
if user is None and not link:
picture = ctx.author.avatar_url
@@ -92,19 +92,19 @@ class Blurplefy:
else:
picture = user.avatar_url
try:
async with self.session.request('GET', picture) as r:
async with self.session.request("GET", picture) as r:
response = await r.read()
except ValueError:
await ctx.send('{}, please link a valid image URL.'.format(ctx.author.display_name))
await ctx.send("{}, please link a valid image URL.".format(ctx.author.display_name))
return
@commands.guild_only()
@commands.command()
@commands.cooldown(rate=1, per=30, type=BucketType.user)
async def blurple(self, ctx, user: discord.Member=None):
async def blurple(self, ctx, user: discord.Member = None):
"""Check a user or uploaded image for blurple content."""
picture = None
await ctx.send('{}, starting blurple image analysis.'.format(ctx.message.author.mention))
await ctx.send("{}, starting blurple image analysis.".format(ctx.message.author.mention))
link = ctx.message.attachments
if user is None and not link:
picture = ctx.author.avatar_url
@@ -119,46 +119,68 @@ class Blurplefy:
role_check = False
try:
async with self.session.request('GET', picture) as r:
async with self.session.request("GET", picture) as r:
response = await r.read()
except ValueError:
await ctx.send('{}, please link a valid image URL.'.format(ctx.author.display_name))
await ctx.send("{}, please link a valid image URL.".format(ctx.author.display_name))
return
try:
im = Image.open(BytesIO(response))
except Exception:
await ctx.send('{}, please link a valid image URL.'.format(ctx.author.display_name))
await ctx.send("{}, please link a valid image URL.".format(ctx.author.display_name))
return
im = im.convert('RGBA')
im = im.convert("RGBA")
imsize = list(im.size)
impixels = imsize[0]*imsize[1]
impixels = imsize[0] * imsize[1]
# 1250x1250 = 1562500
maxpixelcount = 1562500
if impixels > maxpixelcount:
downsizefraction = math.sqrt(maxpixelcount/impixels)
im = resizeimage.resize_width(im, (imsize[0]*downsizefraction))
downsizefraction = math.sqrt(maxpixelcount / impixels)
im = resizeimage.resize_width(im, (imsize[0] * downsizefraction))
imsize = list(im.size)
impixels = imsize[0]*imsize[1]
await ctx.send('{}, image resized smaller for easier processing.'.format(ctx.message.author.display_name))
impixels = imsize[0] * imsize[1]
await ctx.send(
"{}, image resized smaller for easier processing.".format(
ctx.message.author.display_name
)
)
image = self.blurple_imager(im, imsize)
image = discord.File(fp=image, filename='image.png')
image = discord.File(fp=image, filename="image.png")
blurplenesspercentage = round(((nooftotalpixels/noofpixels)*100), 2)
percentblurple = round(((noofblurplepixels/noofpixels)*100), 2)
percentdblurple = round(((noofdarkblurplepixels/noofpixels)*100), 2)
percentwhite = round(((noofwhitepixels/noofpixels)*100), 2)
blurplenesspercentage = round(((nooftotalpixels / noofpixels) * 100), 2)
percentblurple = round(((noofblurplepixels / noofpixels) * 100), 2)
percentdblurple = round(((noofdarkblurplepixels / noofpixels) * 100), 2)
percentwhite = round(((noofwhitepixels / noofpixels) * 100), 2)
embed = discord.Embed(title='', colour=0x7289DA)
embed.add_field(name='Total amount of Blurple', value='{}%'.format(blurplenesspercentage), inline=False)
embed.add_field(name='Blurple (rgb(114, 137, 218))', value='{}%'.format(percentblurple), inline=True)
embed.add_field(name='White (rgb(255, 255, 255))', value='{}\%'.format(percentwhite), inline=True)
embed.add_field(name='Dark Blurple (rgb(78, 93, 148))', value='{}\%'.format(percentdblurple), inline=True)
embed.add_field(name='Guide', value='Blurple, White, Dark Blurple = \nBlurple, White, and Dark Blurple (respectively) \nBlack = Not Blurple, White, or Dark Blurple', inline=False)
embed.set_footer(text='Please note: Discord slightly reduces quality of the images, therefore the percentages may be slightly inaccurate. | Content requested by {}'.format(ctx.author))
embed.set_image(url='attachment://image.png')
embed = discord.Embed(title="", colour=0x7289DA)
embed.add_field(
name="Total amount of Blurple", value="{}%".format(blurplenesspercentage), inline=False
)
embed.add_field(
name="Blurple (rgb(114, 137, 218))", value="{}%".format(percentblurple), inline=True
)
embed.add_field(
name="White (rgb(255, 255, 255))", value="{}\%".format(percentwhite), inline=True
)
embed.add_field(
name="Dark Blurple (rgb(78, 93, 148))",
value="{}\%".format(percentdblurple),
inline=True,
)
embed.add_field(
name="Guide",
value="Blurple, White, Dark Blurple = \nBlurple, White, and Dark Blurple (respectively) \nBlack = Not Blurple, White, or Dark Blurple",
inline=False,
)
embed.set_footer(
text="Please note: Discord slightly reduces quality of the images, therefore the percentages may be slightly inaccurate. | Content requested by {}".format(
ctx.author
)
)
embed.set_image(url="attachment://image.png")
embed.set_thumbnail(url=picture)
await ctx.send(embed=embed, file=image)
@@ -166,16 +188,29 @@ class Blurplefy:
if role_check and blurple_role_enabled:
blurple_role_id = await self.config.guild(ctx.guild).blurple_role()
blurple_role_obj = discord.utils.get(ctx.guild.roles, id=blurple_role_id)
if blurplenesspercentage > 75 and picture == ctx.author.avatar_url and blurple_role_obj not in ctx.author.roles and percentblurple > 5:
await ctx.send('{}, as your profile pic has enough blurple (over 75% in total and over 5% blurple), you have recieved the role **{}**!'.format(ctx.message.author.display_name, blurple_role_obj.name))
if (
blurplenesspercentage > 75
and picture == ctx.author.avatar_url
and blurple_role_obj not in ctx.author.roles
and percentblurple > 5
):
await ctx.send(
"{}, as your profile pic has enough blurple (over 75% in total and over 5% blurple), you have recieved the role **{}**!".format(
ctx.message.author.display_name, blurple_role_obj.name
)
)
await ctx.author.add_roles(blurple_role_obj)
elif picture == ctx.author.avatar_url and blurple_role_obj not in ctx.author.roles:
await ctx.send('{}, your profile pic does not have enough blurple (over 75% in total and over 5% blurple), therefore you are not eligible for the role {}.'.format(ctx.message.author.display_name, blurple_role_obj.name))
await ctx.send(
"{}, your profile pic does not have enough blurple (over 75% in total and over 5% blurple), therefore you are not eligible for the role {}.".format(
ctx.message.author.display_name, blurple_role_obj.name
)
)
@commands.guild_only()
@commands.command()
@commands.cooldown(rate=1, per=30, type=BucketType.user)
async def blurplefy(self, ctx, user: discord.Member=None):
async def blurplefy(self, ctx, user: discord.Member = None):
"""Blurplefy a user or uploaded image."""
picture = None
await ctx.send("{}, starting blurple image analysis.".format(ctx.message.author.mention))
@@ -190,7 +225,7 @@ class Blurplefy:
else:
picture = user.avatar_url
try:
async with self.session.request('GET', picture) as r:
async with self.session.request("GET", picture) as r:
response = await r.read()
except ValueError:
await ctx.send("{}, please link a valid image URL.".format(ctx.author.display_name))
@@ -202,7 +237,7 @@ class Blurplefy:
return
imsize = list(im.size)
impixels = imsize[0]*imsize[1]
impixels = imsize[0] * imsize[1]
# 1250x1250 = 1562500
maxpixelcount = 1562500
@@ -213,14 +248,20 @@ class Blurplefy:
except Exception:
isgif = False
await ctx.send('{}, image fetched, analyzing image...'.format(ctx.message.author.display_name))
await ctx.send(
"{}, image fetched, analyzing image...".format(ctx.message.author.display_name)
)
if impixels > maxpixelcount:
downsizefraction = math.sqrt(maxpixelcount/impixels)
im = resizeimage.resize_width(im, (imsize[0]*downsizefraction))
downsizefraction = math.sqrt(maxpixelcount / impixels)
im = resizeimage.resize_width(im, (imsize[0] * downsizefraction))
imsize = list(im.size)
impixels = imsize[0]*imsize[1]
await ctx.send('{}, image resized smaller for easier processing'.format(ctx.message.author.display_name))
impixels = imsize[0] * imsize[1]
await ctx.send(
"{}, image resized smaller for easier processing".format(
ctx.message.author.display_name
)
)
if isgif is False:
image = self.imager(im, imsize)
@@ -228,9 +269,9 @@ class Blurplefy:
image = self.gifimager(im, gifloop, imsize)
await ctx.send("{}, image data extracted.".format(ctx.author.display_name))
if isgif is False:
image = discord.File(fp=image, filename='image.png')
image = discord.File(fp=image, filename="image.png")
else:
image = discord.File(fp=image, filename='image.gif')
image = discord.File(fp=image, filename="image.gif")
try:
embed = discord.Embed(title="", colour=0x7289DA)
@@ -239,11 +280,19 @@ class Blurplefy:
embed.set_image(url="attachment://image.png")
else:
embed.set_image(url="attachment://image.gif")
embed.set_footer(text="Please note - This blurplefier is automated and therefore may not always give you the best result. | Content requested by {}".format(ctx.author))
embed.set_footer(
text="Please note - This blurplefier is automated and therefore may not always give you the best result. | Content requested by {}".format(
ctx.author
)
)
embed.set_thumbnail(url=picture)
await ctx.send(embed=embed, file=image)
except Exception:
await ctx.send("{}, whoops! It looks like this gif is too big to upload. Try a smaller image (less than 8mb).".format(ctx.author.name))
await ctx.send(
"{}, whoops! It looks like this gif is too big to upload. Try a smaller image (less than 8mb).".format(
ctx.author.name
)
)
@staticmethod
def blurple_imager(im, imsize):
@@ -273,11 +322,13 @@ class Blurplefy:
checkwhite = 1
checkdarkblurple = 1
for i in range(3):
if not(blurple[i]+colourbuffer > pixel[i] > blurple[i]-colourbuffer):
if not (blurple[i] + colourbuffer > pixel[i] > blurple[i] - colourbuffer):
checkblurple = 0
if not(darkblurple[i]+colourbuffer > pixel[i] > darkblurple[i]-colourbuffer):
if not (
darkblurple[i] + colourbuffer > pixel[i] > darkblurple[i] - colourbuffer
):
checkdarkblurple = 0
if not(white[i]+colourbuffer > pixel[i] > white[i]-colourbuffer):
if not (white[i] + colourbuffer > pixel[i] > white[i] - colourbuffer):
checkwhite = 0
if checkblurple == 0 and checkdarkblurple == 0 and checkwhite == 0:
check = 0
@@ -294,28 +345,28 @@ class Blurplefy:
noofpixels += 1
image_file_object = io.BytesIO()
im.save(image_file_object, format='png')
im.save(image_file_object, format="png")
image_file_object.seek(0)
return image_file_object
@staticmethod
def imager(im, imsize):
im = im.convert(mode='L')
im = im.convert(mode="L")
im = ImageEnhance.Contrast(im).enhance(1000)
im = im.convert(mode='RGB')
im = im.convert(mode="RGB")
img = im.load()
for x in range(imsize[0]-1):
for x in range(imsize[0] - 1):
i = 1
for y in range(imsize[1]-1):
for y in range(imsize[1] - 1):
pixel = img[x, y]
if pixel != (255, 255, 255):
img[x, y] = (114, 137, 218)
image_file_object = io.BytesIO()
im.save(image_file_object, format='png')
im.save(image_file_object, format="png")
image_file_object.seek(0)
return image_file_object
@@ -325,9 +376,9 @@ class Blurplefy:
newgif = []
for frame in frames:
frame = frame.convert(mode='L')
frame = frame.convert(mode="L")
frame = ImageEnhance.Contrast(frame).enhance(1000)
frame = frame.convert(mode='RGB')
frame = frame.convert(mode="RGB")
img = frame.load()
for x in range(imsize[0]):
@@ -340,7 +391,7 @@ class Blurplefy:
image_file_object = io.BytesIO()
gif = newgif[0]
gif.save(image_file_object, format='gif', save_all=True, append_images=newgif[1:], loop=0)
gif.save(image_file_object, format="gif", save_all=True, append_images=newgif[1:], loop=0)
image_file_object.seek(0)
return image_file_object
@@ -348,12 +399,23 @@ class Blurplefy:
async def countdown(self, ctx):
"""Countdown to Discord's 4th Anniversary."""
embed = discord.Embed(name="", colour=0x7289da)
timeleft = datetime.datetime(2018, 5, 13) + datetime.timedelta(hours=7) - datetime.datetime.utcnow()
embed.set_author(name='Time left until Discord\'s 4th Anniversary')
timeleft = (
datetime.datetime(2018, 5, 13)
+ datetime.timedelta(hours=7)
- datetime.datetime.utcnow()
)
embed.set_author(name="Time left until Discord's 4th Anniversary")
if int(timeleft.total_seconds()) < 0:
timeleft = datetime.datetime(2019, 5, 13) + datetime.timedelta(hours=7) - datetime.datetime.utcnow()
embed.set_author(name='Time left until Discord\'s 4th Anniversary')
embed.add_field(name='Countdown to midnight, May 13, California time (UTC-7):', value=('{}'.format(self._dynamic_time(int(timeleft.total_seconds())))))
timeleft = (
datetime.datetime(2019, 5, 13)
+ datetime.timedelta(hours=7)
- datetime.datetime.utcnow()
)
embed.set_author(name="Time left until Discord's 4th Anniversary")
embed.add_field(
name="Countdown to midnight, May 13, California time (UTC-7):",
value=("{}".format(self._dynamic_time(int(timeleft.total_seconds())))),
)
await ctx.send(embed=embed)
@staticmethod

22
blurplefy/info.json Normal file
View File

@@ -0,0 +1,22 @@
{
"author": [
"aikaterna"
],
"description": "Blurplefy a user profile picture or image. Admins can configure an awardable role if a user's profile pic has more than a certain percentage of blurple in it.",
"install_msg": "Thanks for installing, have fun.",
"permissions" : [
"embed_links",
"manage_roles"
],
"requirements": [
"pillow",
"python-resize-image"
],
"short": "Blurplefy a user profile picture or image.",
"tags": [
"blurple",
"image",
"profile"
],
"type": "COG"
}

View File

@@ -1,6 +1,6 @@
# Lines 72 through 90 are influenced heavily by cacobot's stats module:
# https://github.com/Orangestar12/cacobot/blob/master/cacobot/stats.py
# Big thanks to Redjumpman for changing the beta version from
# Big thanks to Redjumpman for changing the beta version from
# Imagemagick/cairosvg to matplotlib.
# Thanks to violetnyte for suggesting this cog.
import discord
@@ -8,9 +8,11 @@ import heapq
import os
from io import BytesIO
import matplotlib
matplotlib.use('agg')
matplotlib.use("agg")
import matplotlib.pyplot as plt
plt.switch_backend('agg')
plt.switch_backend("agg")
from discord.ext import commands
@@ -28,34 +30,63 @@ class Chatchart:
sizes = sizes + [others]
labels = labels + ["Others {:g}%".format(others)]
if len(channel.name) >= 19:
channel_name = '{}...'.format(channel.name[:19])
channel_name = "{}...".format(channel.name[:19])
else:
channel_name = channel.name
title = plt.title("Stats in #{}".format(channel_name), color="white")
title.set_va("top")
title.set_ha("center")
plt.gca().axis("equal")
colors = ['r', 'darkorange', 'gold', 'y', 'olivedrab', 'green', 'darkcyan', 'mediumblue', 'darkblue', 'blueviolet', 'indigo', 'orchid', 'mediumvioletred', 'crimson', 'chocolate', 'yellow', 'limegreen','forestgreen','dodgerblue','slateblue','gray']
colors = [
"r",
"darkorange",
"gold",
"y",
"olivedrab",
"green",
"darkcyan",
"mediumblue",
"darkblue",
"blueviolet",
"indigo",
"orchid",
"mediumvioletred",
"crimson",
"chocolate",
"yellow",
"limegreen",
"forestgreen",
"dodgerblue",
"slateblue",
"gray",
]
pie = plt.pie(sizes, colors=colors, startangle=0)
plt.legend(pie[0], labels, bbox_to_anchor=(0.7, 0.5), loc="center", fontsize=10,
bbox_transform=plt.gcf().transFigure, facecolor='#ffffff')
plt.legend(
pie[0],
labels,
bbox_to_anchor=(0.7, 0.5),
loc="center",
fontsize=10,
bbox_transform=plt.gcf().transFigure,
facecolor="#ffffff",
)
plt.subplots_adjust(left=0.0, bottom=0.1, right=0.45)
image_object = BytesIO()
plt.savefig(image_object, format='PNG', facecolor='#36393E')
plt.savefig(image_object, format="PNG", facecolor="#36393E")
image_object.seek(0)
return image_object
@commands.guild_only()
@commands.command()
@commands.cooldown(1, 10, commands.BucketType.channel)
async def chatchart(self, ctx, channel: discord.TextChannel=None, messages=5000):
async def chatchart(self, ctx, channel: discord.TextChannel = None, messages=5000):
"""
Generates a pie chart, representing the last 5000 messages in the specified channel.
"""
e = discord.Embed(description="Loading...", colour=0x00ccff)
e.set_thumbnail(url="https://i.imgur.com/vSp4xRk.gif")
em = await ctx.send(embed=e)
if channel is None:
channel = ctx.message.channel
history = []
@@ -68,33 +99,39 @@ class Chatchart:
except discord.errors.Forbidden:
await em.delete()
return await ctx.send("No permissions to read that channel.")
msg_data = {'total count': 0, 'users': {}}
msg_data = {"total count": 0, "users": {}}
for msg in history:
if len(msg.author.name) >= 20:
short_name = '{}...'.format(msg.author.name[:20])
short_name = "{}...".format(msg.author.name[:20])
else:
short_name = msg.author.name
whole_name = '{}#{}'.format(short_name, msg.author.discriminator)
whole_name = "{}#{}".format(short_name, msg.author.discriminator)
if msg.author.bot:
pass
elif whole_name in msg_data['users']:
msg_data['users'][whole_name]['msgcount'] += 1
msg_data['total count'] += 1
elif whole_name in msg_data["users"]:
msg_data["users"][whole_name]["msgcount"] += 1
msg_data["total count"] += 1
else:
msg_data['users'][whole_name] = {}
msg_data['users'][whole_name]['msgcount'] = 1
msg_data['total count'] += 1
msg_data["users"][whole_name] = {}
msg_data["users"][whole_name]["msgcount"] = 1
msg_data["total count"] += 1
for usr in msg_data['users']:
pd = float(msg_data['users'][usr]['msgcount']) / float(msg_data['total count'])
msg_data['users'][usr]['percent'] = round(pd * 100, 1)
for usr in msg_data["users"]:
pd = float(msg_data["users"][usr]["msgcount"]) / float(msg_data["total count"])
msg_data["users"][usr]["percent"] = round(pd * 100, 1)
top_ten = heapq.nlargest(20, [(x, msg_data['users'][x][y])
for x in msg_data['users']
for y in msg_data['users'][x]
if y == 'percent'], key=lambda x: x[1])
top_ten = heapq.nlargest(
20,
[
(x, msg_data["users"][x][y])
for x in msg_data["users"]
for y in msg_data["users"][x]
if y == "percent"
],
key=lambda x: x[1],
)
others = 100 - sum(x[1] for x in top_ten)
img = self.create_chart(top_ten, others, channel)
await em.delete()
await ctx.message.channel.send(file=discord.File(img, 'chart.png'))
await ctx.message.channel.send(file=discord.File(img, "chart.png"))

View File

@@ -1,14 +1,18 @@
{
"author": [
"Redjumpman and aikaterna"
"aikaterna",
"Redjumpman"
],
"description": "Generate a pie chart from the last 5000 messages in a channel to see who's been talking the most.",
"install_msg": "Thanks for installing, have fun.",
"short": "Generate a pie chart from the last 5000 messages",
"tags": [
"data",
"chart",
"activity"
],
"requirements": ["matplotlib"],
"requirements": [
"matplotlib"
],
"type": "COG"
}

View File

@@ -66,13 +66,16 @@ class Dungeon:
blacklist_msg = ", blacklisted from the bot,"
else:
blacklist_msg = ""
msg = f"{user} has been sent to the dungeon{blacklist_msg} and has had all previous roles stripped."
msg = (
f"{user} has been sent to the dungeon{blacklist_msg} and has had all previous roles stripped."
)
await ctx.send(msg)
@commands.group(autohelp=True)
@commands.guild_only()
@checks.admin_or_permissions(manage_server=True)
async def dungeon(self, ctx):
"""Main dungeon commands."""
pass
@dungeon.command()
@@ -233,7 +236,9 @@ class Dungeon:
blacklist_msg = " and the bot blacklist"
else:
blacklist_msg = ""
msg = f"{user} has been removed from the dungeon{blacklist_msg} and now has the initial user role."
msg = (
f"{user} has been removed from the dungeon{blacklist_msg} and now has the initial user role."
)
await ctx.send(msg)
if dm_toggle:
@@ -363,7 +368,9 @@ class Dungeon:
blacklist = await self.config.guild(member.guild).auto_blacklist()
dungeon_role_id = await self.config.guild(member.guild).dungeon_role()
dungeon_role_obj = discord.utils.get(member.guild.roles, id=dungeon_role_id)
perm_msg = f"dungeon.py: Unable to auto-ban user, permissions needed and no announce channel set. Guild: {member.guild.id}"
perm_msg = (
f"dungeon.py: Unable to auto-ban user, permissions needed and no announce channel set. Guild: {member.guild.id}"
)
if auto_ban:
if auto_ban_msg:
@@ -392,7 +399,9 @@ class Dungeon:
if not mod_log:
if announce_channel:
msg = f"Auto-banned new user: \n**{member}** ({member.id})\n{self._dynamic_time(int(since_join.total_seconds()))} old account"
msg = (
f"Auto-banned new user: \n**{member}** ({member.id})\n{self._dynamic_time(int(since_join.total_seconds()))} old account"
)
return await channel_object.send(msg)
else:
print(perm_msg)
@@ -434,7 +443,9 @@ class Dungeon:
print("dungeon.py: I need permissions to manage channels and manage roles.")
return
msg = f"Auto-banished new user: \n**{member}** ({member.id})\n{self._dynamic_time(int(since_join.total_seconds()))} old account"
msg = (
f"Auto-banished new user: \n**{member}** ({member.id})\n{self._dynamic_time(int(since_join.total_seconds()))} old account"
)
if default_avatar:
msg += ", no profile picture set"
await channel_object.send(msg)

19
dungeon/info.json Normal file
View File

@@ -0,0 +1,19 @@
{
"author": [
"aikaterna"
],
"description": "Provides additional raid protection for servers utilizing a welcome/rules join channel.",
"install_msg": "Please read the additional instructions at: <https://github.com/aikaterna/aikaterna-cogs/blob/v3/dungeon_readme.md>",
"min_python_version": [3, 6, 0],
"permissions" : [
"ban_members",
"manage_channels",
"manage_roles"
],
"short": "",
"tags": [
"dungeon",
"autoban"
],
"type": "COG"
}

View File

@@ -1,7 +1,7 @@
{
"AUTHOR" : "aikaterna",
"INSTALL_MSG" : "Thanks for installing. Please PR any issues or code changes, I'm sure some cogs of mine will need some work.",
"NAME" : "aikaterna-cogs",
"SHORT" : "Some cogs I've mashed together while learning Python.",
"DESCRIPTION" : "Someday, this repository will have cogs that I actually wrote by myself. Until then, enjoy my learning process of taking code and modifying it."
}
"author" : "aikaterna (aikaterna#1393)",
"install_msg" : "Thanks for installing. Please submit issue reports on my repo if something's broken. You can find me in the Red servers or at the invite on my repo.",
"name" : "aikaterna-cogs",
"short" : "Utility and fun cogs",
"description" : "Cogs requested by others, personal cogs, or orphaned cogs."
}

16
inspirobot/info.json Normal file
View File

@@ -0,0 +1,16 @@
{
"author": [
"aikaterna"
],
"description": "Fetch a random 'inspiring' message from http://inspirobot.me",
"install_msg": "Thanks for installing, have fun.",
"permissions" : [
"embed_links"
],
"short": "Fetch 'inspiring' messages.",
"tags": [
"inspire",
"inspirobot"
],
"type": "COG"
}

View File

@@ -2,8 +2,8 @@ import aiohttp
import discord
from redbot.core import commands
class Inspirobot:
class Inspirobot:
def __init__(self, bot):
self.bot = bot
self.session = aiohttp.ClientSession()
@@ -12,13 +12,15 @@ class Inspirobot:
async def inspireme(self, ctx):
"""Fetch a random "inspirational message" from the bot."""
try:
async with self.session.request("GET", "http://inspirobot.me/api?generate=true") as page:
pic = await page.text(encoding='utf-8')
async with self.session.request(
"GET", "http://inspirobot.me/api?generate=true"
) as page:
pic = await page.text(encoding="utf-8")
em = discord.Embed()
em.set_image(url=pic)
await ctx.send(embed=em)
except Exception as e:
await ctx.send(f"Oops, there was a problem: {e}")
await ctx.send(f"Oops, there was a problem: {e}")
def __unload(self):
self.session.close()

15
partycrash/info.json Normal file
View File

@@ -0,0 +1,15 @@
{
"author": [
"aikaterna"
],
"description": "Posts invites to servers, if the bot is allowed to view them. Does not generate new invites.",
"install_msg": "Thanks for installing, have fun.",
"permissions" : [
"manage_server"
],
"short": "Post server invites.",
"tags": [
"invite"
],
"type": "COG"
}

13
pingtime/info.json Normal file
View File

@@ -0,0 +1,13 @@
{
"author": [
"aikaterna"
],
"description": "It's ping... with latency. Shows all shards.",
"install_msg": "Thanks for installing, have fun.",
"short": "Ping pong.",
"tags": [
"pingtime",
"latency"
],
"type": "COG"
}

View File

@@ -2,7 +2,6 @@ from discord.ext import commands
class Pingtime:
def __init__(self, bot):
self.bot = bot
@@ -12,5 +11,5 @@ class Pingtime:
latencies = self.bot.latencies
msg = "Pong!\n"
for shard, pingt in latencies:
msg += "Shard {}/{}: {}ms\n".format(shard + 1, len(latencies), round(pingt*1000))
msg += "Shard {}/{}: {}ms\n".format(shard + 1, len(latencies), round(pingt * 1000))
await ctx.send(msg)

19
retrosign/info.json Normal file
View File

@@ -0,0 +1,19 @@
{
"author": [
"aikaterna"
],
"description": "A port of Anismash's retrosign cog for v2: <https://github.com/Anismash/Ani-Cogs/tree/master/retrosign",
"install_msg": "Thanks for installing, have fun.",
"permissions" : [
"attach_files"
],
"requirements": [
"BeautifulSoup"
],
"short": "Posts an image of text",
"tags": [
"retro",
"80s"
],
"type": "COG"
}

View File

@@ -34,7 +34,7 @@ class Retrosign:
else:
return await ctx.send("\N{CROSS MARK} Your line is too long (14 character limit)")
elif len(texts) == 3:
texts[0] = re.sub("[^a-zA-Z0-9] ", "", texts[0])
texts[0] = re.sub("[^A-Za-z0-9 ]", "", texts[0])
if len(texts[0]) >= 15:
return await ctx.send(
"\N{CROSS MARK} Your first line is too long (14 character limit)"

12
rndstatus/info.json Normal file
View File

@@ -0,0 +1,12 @@
{
"author": [
"aikaterna"
],
"description": "Random statuses with an optional bot stats mode. Ported from Twentysix's v2 cog.",
"install_msg": "Thanks for installing, have fun.",
"short": "Random bot statuses",
"tags": [
"status"
],
"type": "COG"
}

View File

@@ -1,11 +1,12 @@
{
"author": [
"aikaterna and Paddo"
"aikaterna"
],
"description": "Check when the user was last active on a server.",
"description": "Check when the user was last active on a server. Originally made by Paddo.",
"short": "Check when the user was last active on a server.",
"tags": [
"seen", "activity"
"seen",
"activity"
],
"type": "COG"
}

View File

@@ -11,43 +11,43 @@ class Seen:
self.bot = bot
self.config = Config.get_conf(self, 2784481001, force_registration=True)
default_member = {
"member_seen": []
}
default_member = {"member_seen": []}
self.config.register_member(**default_member)
@commands.guild_only()
@commands.command(name='seen')
@commands.command(name="seen")
async def _seen(self, ctx, author: discord.Member):
'''Shows last time a user was seen in chat'''
"""Shows last time a user was seen in chat"""
member_seen = await self.config.member(author).member_seen()
now = int(time.time())
try:
time_elapsed = int(now - member_seen)
except TypeError:
embed = discord.Embed(colour=discord.Color.red(), title='I haven\'t seen that user yet.')
embed = discord.Embed(
colour=discord.Color.red(), title="I haven't seen that user yet."
)
return await ctx.send(embed=embed)
output = self._dynamic_time(time_elapsed)
if output[2] < 1:
ts = 'just now'
ts = "just now"
else:
ts = ''
ts = ""
if output[0] == 1:
ts += '{} day, '.format(output[0])
ts += "{} day, ".format(output[0])
elif output[0] > 1:
ts += '{} days, '.format(output[0])
ts += "{} days, ".format(output[0])
if output[1] == 1:
ts += '{} hour, '.format(output[1])
ts += "{} hour, ".format(output[1])
elif output[1] > 1:
ts += '{} hours, '.format(output[1])
ts += "{} hours, ".format(output[1])
if output[2] == 1:
ts += '{} minute ago'.format(output[2])
ts += "{} minute ago".format(output[2])
elif output[2] > 1:
ts += '{} minutes ago'.format(output[2])
ts += "{} minutes ago".format(output[2])
em = discord.Embed(colour=discord.Color.green())
avatar = author.avatar_url if author.avatar else author.default_avatar_url
em.set_author(name='{} was seen {}'.format(author.display_name, ts), icon_url=avatar)
em.set_author(name="{} was seen {}".format(author.display_name, ts), icon_url=avatar)
await ctx.send(embed=em)
def _dynamic_time(self, time_elapsed):
@@ -57,7 +57,10 @@ class Seen:
return (d, h, m)
async def on_message(self, message):
if not isinstance(message.channel, discord.abc.PrivateChannel) and self.bot.user.id != message.author.id:
if (
not isinstance(message.channel, discord.abc.PrivateChannel)
and self.bot.user.id != message.author.id
):
prefixes = await self.bot.get_prefix(message)
if not any(message.content.startswith(n) for n in prefixes):
author = message.author

12
wolfram/info.json Normal file
View File

@@ -0,0 +1,12 @@
{
"author": [
"aikaterna"
],
"description": "Query Wolfram|Alpha for answers. Requires a free API key. Originally by Paddo.",
"install_msg": "Thanks for installing, have fun.",
"short": "Query Wolfram|Alpha for answers.",
"tags": [
"wolfram"
],
"type": "COG"
}

View File

@@ -6,28 +6,26 @@ import xml.etree.ElementTree as ET
class Wolfram:
"""Ask Wolfram Alpha a question."""
def __init__(self, bot):
self.bot = bot
default_global = {
"WOLFRAM_API_KEY": None,
}
default_global = {"WOLFRAM_API_KEY": None}
self.config = Config.get_conf(self, 2788801004)
self.config.register_guild(**default_global)
@commands.command(name='wolfram', aliases=['ask'])
@commands.command(name="wolfram", aliases=["ask"])
async def _wolfram(self, ctx, *arguments: str):
"""
Ask Wolfram Alpha any question.
"""
api_key = await self.config.WOLFRAM_API_KEY()
if api_key:
url = 'http://api.wolframalpha.com/v2/query?'
query = ' '.join(arguments)
payload = {'input': query, 'appid': api_key}
headers = {'user-agent': 'Red-cog/2.0.0'}
url = "http://api.wolframalpha.com/v2/query?"
query = " ".join(arguments)
payload = {"input": query, "appid": api_key}
headers = {"user-agent": "Red-cog/2.0.0"}
conn = aiohttp.TCPConnector(verify_ssl=False)
session = aiohttp.ClientSession(connector=conn)
async with session.get(url, params=payload, headers=headers) as r:
@@ -35,18 +33,20 @@ class Wolfram:
session.close()
root = ET.fromstring(result)
a = []
for pt in root.findall('.//plaintext'):
for pt in root.findall(".//plaintext"):
if pt.text:
a.append(pt.text.capitalize())
if len(a) < 1:
message = 'There is as yet insufficient data for a meaningful answer.'
message = "There is as yet insufficient data for a meaningful answer."
else:
message = '\n'.join(a[0:3])
message = "\n".join(a[0:3])
else:
message = 'No API key set for Wolfram Alpha. Get one at http://products.wolframalpha.com/api/'
await ctx.send('```{0}```'.format(message))
message = (
"No API key set for Wolfram Alpha. Get one at http://products.wolframalpha.com/api/"
)
await ctx.send("```{0}```".format(message))
@commands.command(name='setwolframapi', aliases=['setwolfram'])
@commands.command(name="setwolframapi", aliases=["setwolfram"])
@checks.is_owner()
async def _setwolframapi(self, ctx, key: str):
"""