Compare commits

..
49 Commits
Author SHA1 Message Date
Dustin Pianalto 897c77fee6 moved song 2018-06-18 15:04:00 -08:00
Dustin Pianalto 9c340116eb remove detailed error messages 2018-06-11 19:18:26 -08:00
Dustin Pianalto 52174175ef Add error color to bot instance 2018-06-11 19:11:48 -08:00
Dustin Pianalto 0858fbc7d5 Shortened help strings 2018-06-11 18:50:03 -08:00
Dustin Pianalto 3e75b20c54 Added help strings 2018-06-11 18:31:08 -08:00
Dustin Pianalto 3dc75dabe6 Added help strings 2018-06-11 18:28:00 -08:00
Dustin Pianalto db525d0048 Added help strings 2018-06-11 18:17:04 -08:00
Dustin Pianalto 35ab455a7c added help docstring
adjusted help line length
2018-06-11 17:32:59 -08:00
Dustin Pianalto 66cbaffc7a Merge remote-tracking branch 'origin/release-1.0.0' into release-1.0.0 2018-06-11 10:47:40 -08:00
Dustin Pianalto 71686b4cc2 fixed layout in ping 2018-06-11 10:47:16 -08:00
Dustin Pianalto 7ac58a435c v1.0.0b2 2018-06-11 02:34:24 -08:00
Dustin Pianalto d596db870b fixed bug in admin close 2018-06-11 02:26:41 -08:00
Dustin Pianalto 69109dc3a9 fixed bug in admin new 2018-06-11 02:22:18 -08:00
Dustin Pianalto c4a0398a60 fixed bug in admin new 2018-06-11 02:17:15 -08:00
Dustin Pianalto 90ca2d0fac fixed bug in admin new 2018-06-11 02:15:34 -08:00
Dustin Pianalto 4bf8649950 removed print from patreon 2018-06-11 02:11:08 -08:00
Dustin Pianalto 70545be638 fixed bug in patreon 2018-06-11 02:10:20 -08:00
Dustin Pianalto d56fb072bb test patreon 2018-06-11 02:07:50 -08:00
Dustin Pianalto 49894b2dd7 test patreon 2018-06-11 02:06:29 -08:00
Dustin Pianalto b4a5f83689 test patreon 2018-06-11 02:04:46 -08:00
Dustin Pianalto 63b87bf1c7 fix git status paginator 2018-06-11 02:00:35 -08:00
Dustin Pianalto dd96a9cf90 update git status to new book 2018-06-11 01:59:14 -08:00
Dustin Pianalto 9c281c6d7f hide print_infections 2018-06-11 01:55:14 -08:00
Dustin Pianalto 0c4fd467ff add todo 2018-06-11 01:53:18 -08:00
Dustin Pianalto f11f53ac81 hide view_code 2018-06-11 01:51:02 -08:00
Dustin Pianalto dc51b4e6b6 fixed bug in view_code 2018-06-11 01:50:36 -08:00
Dustin Pianalto 3531459b03 fixed bug in _allowed_channels 2018-06-11 00:37:17 -08:00
Dustin Pianalto 31a245a7db fixed bug in _allowed_channels 2018-06-11 00:20:28 -08:00
Dustin Pianalto 8c7f33c166 fixed bug in _allowed_channels 2018-06-11 00:11:06 -08:00
Dustin Pianalto 512588a34c fixed bug in _allowed_channels 2018-06-10 22:09:03 -08:00
Dustin Pianalto 7c3e9726f9 fixed bug in _allowed_channels 2018-06-10 22:07:18 -08:00
Dustin Pianalto 95c7bcb928 fixed bug in _allowed_channels 2018-06-10 22:04:21 -08:00
Dustin Pianalto 44c8ca1eb5 fixed bug in _allowed_channels 2018-06-10 22:02:42 -08:00
Dustin Pianalto 9d894a4438 fixed bug in _allowed_channels 2018-06-10 22:01:16 -08:00
Dustin Pianalto 2bdbdb9749 fixed bug in _allowed_channels 2018-06-10 21:56:40 -08:00
Dustin Pianalto 9b47aff4b0 fixed bug in _allowed_channels 2018-06-10 21:55:14 -08:00
Dustin Pianalto 54d5be24e8 rewrote _allowed_channels 2018-06-10 21:44:56 -08:00
Dustin Pianalto d616a94709 testing _allowed_channels 2018-06-09 15:18:30 -08:00
Dustin Pianalto f8fe207721 testing _allowed_channels 2018-06-09 15:14:25 -08:00
Dustin Pianalto 2259900dcd fixed bug in _allowed_channels 2018-06-09 15:07:36 -08:00
Dustin Pianalto ec6cd95c9e test allowed_channels 2018-06-09 15:05:26 -08:00
Dustin Pianalto d14de7a964 Fixed bug in _allowed_channels 2018-06-09 14:58:39 -08:00
Dustin Pianalto a77f976562 Fixed bug in _allowed_channels 2018-06-09 14:58:04 -08:00
Dustin Pianalto 687c62dce7 Fixed bug in _allowed_channels 2018-06-09 14:57:15 -08:00
Dustin Pianalto 778e9890ba Fixed bug in _allowed_channels 2018-06-09 14:51:39 -08:00
Dustin Pianalto b46d8dd366 Fixed bug in _allowed_channels 2018-06-09 14:26:28 -08:00
Dustin Pianalto 46c9075397 changed help line length 2018-06-09 14:17:01 -08:00
Dustin Pianalto 677fc9a60e changed help line length 2018-06-09 14:14:15 -08:00
Dustin Pianalto 4c70c67f31 changed help line length 2018-06-09 14:11:19 -08:00
9 changed files with 131 additions and 95 deletions
+5
View File
@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
+4 -3
View File
@@ -44,7 +44,7 @@ emojis: Dict[str, str] = {
class Geeksbot(commands.Bot):
def __init__(self, **kwargs):
kwargs["command_prefix"] = self.get_custom_prefix
self.description = 'I am Geeksbot Dev! Fear me!\n I might just break and take you with me :P'
self.description = 'I am Geeksbot! Fear me!'
kwargs['description'] = self.description
super().__init__(**kwargs)
self.aio_session = aiohttp.ClientSession(loop=self.loop)
@@ -56,13 +56,14 @@ class Geeksbot(commands.Bot):
self.infected = {}
self.TOKEN = self.bot_secrets['token']
self.embed_color = discord.Colour.from_rgb(49, 107, 111)
self.error_color = discord.Colour.from_rgb(142, 29, 31)
del self.bot_secrets['token']
self.db_con = database.DatabaseConnection(**self.bot_secrets['db_con'])
self.default_prefix = 'g~'
self.default_prefix = 'g$'
self.voice_chans = {}
self.spam_list = {}
self.owner_id = 351794468870946827
self.__version__ = '1.0.0b'
self.__version__ = 'v1.0.0'
self.gcs_service = build('customsearch', 'v1', developerKey=self.bot_secrets['google_search_key'])
self.tpe = futures.ThreadPoolExecutor()
self.geo_api = '2d4e419c2be04c8abe91cb5dd1548c72'
+52 -46
View File
@@ -94,22 +94,22 @@ class Admin:
@commands.group(case_insensitive=True)
async def set(self, ctx):
"""Run help set for more info"""
"""Group for setting configuration options"""
pass
@commands.group(case_insensitive=True)
async def add(self, ctx):
"""Run help set for more info"""
"""Group for adding items to guild config"""
pass
@commands.group(case_insensitive=True)
async def remove(self, ctx):
"""Run help set for more info"""
"""Group for removing items from guild config"""
pass
@set.command(name='admin_chan', aliases=['ac', 'admin_chat', 'admin chat'])
async def _admin_channel(self, ctx, channel: discord.TextChannel=None):
"""Sets the channel for admin specific notifications"""
"""Sets the admin notification channel"""
if ctx.guild:
if await checks.is_admin(self.bot, ctx):
if channel is not None:
@@ -119,7 +119,8 @@ class Admin:
@set.command(name='channel_lockdown', aliases=['lockdown', 'restrict_access', 'cl'])
async def _channel_lockdown(self, ctx, config='true'):
"""Toggles the channel lockdown restricting Geeksbot to only access channels defined in allowed_channels
"""Toggles the channel lockdown restriction
When this is active Geeksbot can only respond in channels defined in allowed_channels
If you run this before configuring allowed_channels it will tell you to run that command first."""
if ctx.guild:
if await checks.is_admin(self.bot, ctx):
@@ -146,62 +147,67 @@ class Admin:
@add.command(name='allowed_channels', aliases=['channel', 'ac'])
async def _allowed_channels(self, ctx, *, channels):
"""Allows Admin to restrict what channels Geeksbot is allowed to access
This only takes effect if channel_lockdown is enabled."""
"""Defines channels Geeksbot can respond in
This only takes effect if channel_lockdown is enabled.
If one of the channels passed is not found then it is ignored."""
if ctx.guild:
if await checks.is_admin(self.bot, ctx):
channels = channels.lower().replace(' ', '').split(',')
added = ''
for channel in channels:
chnl = discord.utils.get(ctx.guild.channels, name=channel)
if chnl is None:
await ctx.send(f'{channel} is not a valid text channel in this guild.')
else:
admin_log.info('Chan found')
if await self.bot.db_con.fetchval('select allowed_channels from guild_config '
'where guild_id = $1', ctx.guild.id):
if chnl.id in json.loads(await self.bot.db_con.fetchval('select allowed_channels '
'from guild_config '
'where guild_id = $1',
ctx.guild.id)):
admin_log.info('Chan found in config')
await ctx.send(f'{channel} is already in the list of allowed channels. Skipping...')
else:
admin_log.info('Chan not found in config')
allowed_channels = json.loads(await self.bot.db_con.fetchval('select allowed_channels '
'from guild_config '
'where guild_id = $1',
ctx.guild.id))\
.append(chnl.id)
await self.bot.db_con.execute('update guild_config set allowed_channels = $2 '
'where guild_id = $1', ctx.guild.id, allowed_channels)
added = f'{added}\n{channel}'
else:
admin_log.info('Chan not found in config')
allowed_channels = [chnl.id]
await self.bot.db_con.execute('update guild_config set allowed_channels = $2 '
'where guild_id = $1', ctx.guild.id, allowed_channels)
added = f'{added}\n{channel}'
if added != '':
await ctx.send(f'The following channels have been added to the allowed channel list: {added}')
existing_channels = list()
channels_add = list()
admin_log.info(channels)
allowed_channels = await self.bot.db_con.fetchval('select allowed_channels from guild_config '
'where guild_id = $1', ctx.guild.id)
if allowed_channels == 'null':
allowed_channels = None
channels = [discord.utils.get(ctx.guild.channels, name=channel)
for channel in channels if channel is not None]
if allowed_channels and channels:
allowed_channels = [int(channel) for channel in json.loads(allowed_channels)]
existing_channels = [channel for channel in channels if channel.id in allowed_channels]
channels_add = [channel for channel in channels if channel.id not in allowed_channels]
allowed_channels += [channel.id for channel in channels if channel.id not in allowed_channels]
await self.bot.db_con.execute('update guild_config set allowed_channels = $2 where guild_id = $1',
ctx.guild.id, json.dumps(allowed_channels))
elif channels:
admin_log.info('Config is empty')
allowed_channels = [channel.id for channel in channels]
await self.bot.db_con.execute('update guild_config set allowed_channels = $2 '
'where guild_id = $1', ctx.guild.id,
json.dumps(allowed_channels))
else:
await ctx.send('None of those are valid text channels for this guild.')
return
if existing_channels:
channel_str = '\n'.join([str(channel.name) for channel in existing_channels])
await ctx.send(f'The following channels were skipped because they are already in the config:\n'
f'{channel_str}\n')
if channels_add:
channel_str = '\n'.join([str(channel.name) for channel in channels_add])
await ctx.send('The following channels have been added to the allowed channel list:\n'
f'{channel_str}\n')
await ctx.message.add_reaction('')
else:
await ctx.send(f'You are not authorized to run this command.')
else:
await ctx.send('This command must be run from inside a guild.')
@commands.command()
# TODO Fix view_code
@commands.command(hidden=True)
@commands.is_owner()
async def view_code(self, ctx, code_name):
pag = utils.Paginator(self.bot, prefix='```py', suffix='```')
pag.add(inspect.getsource(self.bot.get_command(code_name).callback))
pag.add(inspect.getsource(self.bot.all_commands[code_name].callback))
for page in pag.pages():
await ctx.send(page)
@add.command(aliases=['prefix', 'p'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
async def add_prefix(self, ctx, *, prefix=None):
"""Adds a guild specific prefix to the guild config
"""Adds a custom prefix for the current guild
Note: This overwrites the default of g$. If you would
like to keep using g$ you will need to add it to the
Guild config as well."""
@@ -234,7 +240,7 @@ class Admin:
@remove.command(aliases=['prefix', 'p'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
async def remove_prefix(self, ctx, *, prefix=None):
"""Removes a guild specific prefix from the guild config
"""Removes custom prefix from the current guild
If the last prefix is removed then Geeksbot will default
Back to g$"""
if ctx.guild:
@@ -273,7 +279,7 @@ class Admin:
@commands.cooldown(1, 5, type=commands.BucketType.guild)
@commands.check(checks.is_guild_owner)
async def _add_admin_role(self, ctx, role=None):
"""The Guild owner can add a role to the admin list
"""Adds role to the admin list for current guild
Allowing members of that role to run admin commands
on the current guild."""
role = discord.utils.get(ctx.guild.roles, name=role)
@@ -294,7 +300,7 @@ class Admin:
@commands.cooldown(1, 5, type=commands.BucketType.guild)
@commands.check(checks.is_guild_owner)
async def _remove_admin_role(self, ctx, role=None):
"""The Guild owner can remove a role from the admin list"""
"""Removes role from admin list in current guild"""
role = discord.utils.get(ctx.guild.roles, name=role)
if role is not None:
roles = json.loads(await self.bot.db_con.fetchval('select admin_roles from guild_config '
+7 -7
View File
@@ -150,13 +150,13 @@ class BotEvents:
# noinspection PyMethodMayBeStatic
async def on_command_error(self, ctx, error):
pag = utils.Paginator(ctx.bot)
import traceback
if ctx.channel.id == 418452585683484680 and type(error) == commands.errors.CommandNotFound:
return
pag.add(''.join(traceback.format_exception(type(error), error, error.__traceback__)))
for page in pag.pages():
await ctx.send(page)
pag = utils.Paginator(ctx.bot, embed=True, max_line_length=48)
pag.set_embed_meta(title=f'Command Error',
color=self.bot.error_color,
thumbnail=f'{ctx.guild.me.avatar_url}')
pag.add(error)
book = utils.Book(pag, (None, ctx.channel, self.bot, ctx.message))
await book.create_book()
async def on_guild_join(self, guild):
with open(f"{config_dir}{default_guild_config_file}", 'r') as file:
+8 -1
View File
@@ -33,6 +33,9 @@ class Fun:
@commands.command()
@commands.cooldown(1, 30, type=commands.BucketType.user)
async def infect(self, ctx, member: discord.Member, emoji):
"""Infects a user with the given emoji
Every time the user sends a message that I am also in I will react to that message with said emoji."""
if member.id == self.bot.user.id and ctx.author.id != owner_id:
await ctx.send(f'You rolled a Critical Fail...\nInfection bounces off and rebounds on the attacker.')
member = ctx.author
@@ -48,6 +51,7 @@ class Fun:
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def heal(self, ctx, member: discord.Member):
"""Removes infection from user."""
if ctx.author == member and ctx.author.id != owner_id:
await ctx.send('You can\'t heal yourself silly...')
else:
@@ -57,7 +61,7 @@ class Fun:
else:
await ctx.send(f'{member.display_name} is not infected...')
@commands.command()
@commands.command(hidden=True)
@commands.is_owner()
async def print_infections(self, ctx):
await ctx.author.send(f'```{self.bot.infected}```')
@@ -65,6 +69,7 @@ class Fun:
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def slap(self, ctx, member: discord.Member):
"""IRC Style Trout Slap"""
trout = await self.bot.db_con.fetchval("select code from geeksbot_emojis where id = 449083238766477312")
if member.id == self.bot.user.id and ctx.author.id != owner_id:
await ctx.send(f'You rolled a Critical Fail...\nThe trout bounces off and rebounds on the attacker.')
@@ -84,6 +89,7 @@ class Fun:
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def fact(self, ctx, number: int):
"""Returns the given factorial up to 20,000!"""
if 0 < number < 20001:
n = 1990
with ctx.channel.typing():
@@ -150,6 +156,7 @@ class Fun:
@commands.command(name='explode', aliases=['splode'])
async def explode_user(self, ctx, member: discord.Member=None):
"""Trolls user by punching them to oblivion."""
if member is None or member.id == 396588996706304010:
member = ctx.author
+11 -11
View File
@@ -16,7 +16,7 @@ class Git:
@commands.group(case_insensitive=True, invoke_without_command=True)
async def git(self, ctx):
"""Run help git for more info"""
"""Shows my Git link"""
em = discord.Embed(style='rich',
title=f'Here is where you can find my code',
url='https://github.com/dustinpianalto/Geeksbot/tree/development',
@@ -29,6 +29,7 @@ class Git:
@git.command()
@commands.is_owner()
async def pull(self, ctx):
"""Pulls updates from GitHub rebasing branch."""
pag = Paginator(self.bot, max_line_length=44, embed=True)
pag.set_embed_meta(title='Git Pull',
color=self.bot.embed_color,
@@ -41,23 +42,22 @@ class Git:
pag.add('\uFFF7\n\uFFF8')
pag.add(await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | '
'sed "s/.*@.*[.].*/ /g"')), 10))
msg = await ctx.send('Starting Book')
book = Book(pag, (msg, ctx.channel, self.bot, ctx.message))
book = Book(pag, (None, ctx.channel, self.bot, ctx.message))
await book.create_book()
@git.command()
@commands.is_owner()
async def status(self, ctx):
pag = Paginator(max_line_length=60, max_lines=30, max_chars=1014)
em = discord.Embed(style='rich',
title=f'Git Pull',
color=embed_color)
em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}')
"""Gets status of current branch."""
pag = Paginator(self.bot, max_line_length=44, max_lines=30, embed=True)
pag.set_embed_meta(title='Git Status',
color=self.bot.embed_color,
thumbnail=f'{ctx.guild.me.avatar_url}')
result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git status')), 10)
pag.add(result)
for page in pag.pages():
em.add_field(name='', value=f'{page}')
await ctx.send(embed=em)
book = Book(pag, (None, ctx.channel, self.bot, ctx.message))
await book.create_book()
def setup(bot):
+3 -3
View File
@@ -18,10 +18,10 @@ class Patreon:
async def get_patreon_links(self, ctx, target: discord.Member=None):
"""Prints Patreon information for creators on the server."""
if await self.bot.db_con.fetchval('select patreon_enabled from guild_config where guild_id = $1', ctx.guild.id):
patreon_info = await self.bot.db_con.fetchval('select patreon_message,patreon_links from guild_config '
patreon_info = await self.bot.db_con.fetchrow('select patreon_message,patreon_links from guild_config '
'where guild_id = $1', ctx.guild.id)
message = patreon_info[0].replace('\\n', '\n')
patreon_links = json.loads(patreon_info[1])
message = patreon_info['patreon_message'].replace('\\n', '\n')
patreon_links = json.loads(patreon_info['patreon_links'])
for key in patreon_links:
message = message + '\n{0}: {1}'.format(key, patreon_links[key])
if target is None:
+41 -24
View File
@@ -54,15 +54,15 @@ class Utils:
msg = await self.bot.wait_for('message', timeout=5, check=check)
self.bot.ping_times[i]['rec'] = msg
@commands.command()
@commands.command(hidden=True)
async def channel_ping(self, ctx, wait_time: float=10, message: str='=bump', channel: int=265828729970753537):
await ctx.send('Starting Background Process.')
self.bot.loop.create_task(self._4_hour_ping(channel, message, wait_time))
@commands.command()
@commands.command(hidden=True)
@commands.is_owner()
async def sysinfo(self, ctx):
"""WIP Gets current system status for the server that Geeksbot is running on."""
"""Gets system status for my server."""
await ctx.send(f'```ml\n'
f'CPU Percentages: {psutil.cpu_percent(percpu=True)}\n'
f'Memory Usage: {psutil.virtual_memory().percent}%\n'
@@ -178,7 +178,10 @@ class Utils:
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def ping(self, ctx, mode='normal', count: int=2):
"""Check the Bot\'s connection to Discord"""
"""Check the Bot\'s connection to Discord
For more detailed information set the <mode> as comp and it will test the ping
<count> number of times."""
em = discord.Embed(style='rich',
title=f'Pong 🏓',
color=discord.Colour.green()
@@ -186,8 +189,8 @@ class Utils:
msg = await ctx.send(embed=em)
time1 = ctx.message.created_at
time = (msg.created_at - time1).total_seconds() * 1000
em.description = f'''Response Time: **{math.ceil(time)}ms**
Discord Latency: **{math.ceil(self.bot.latency*1000)}ms**'''
em.description = f'Response Time: **{math.ceil(time)}ms**\n' \
f'Discord Latency: **{math.ceil(self.bot.latency*1000)}ms**'
await msg.edit(embed=em)
if mode == 'comp':
@@ -216,8 +219,8 @@ class Utils:
time = time.total_seconds()
times.append(time)
value = f"Message Sent:" \
f"{datetime.strftime(self.bot.ping_times[i]['snd'].created_at, '%H:%M:%S.%f')}" \
f"Response Received: {datetime.strftime(now, '%H:%M:%S.%f')}" \
f"{datetime.strftime(self.bot.ping_times[i]['snd'].created_at, '%H:%M:%S.%f')}\n" \
f"Response Received: {datetime.strftime(now, '%H:%M:%S.%f')}\n" \
f"Total Time: {math.ceil(time * 1000)}ms"
await self.bot.ping_times[i]['rec'].delete()
em.add_field(name=f'Ping Test {i}', value=value, inline=True)
@@ -234,7 +237,7 @@ class Utils:
@commands.group(case_insensitive=True)
async def admin(self, ctx):
"""Run help admin for more info"""
"""Group for Admin help requests"""
pass
@admin.command(name='new', aliases=['nr'])
@@ -254,17 +257,12 @@ class Utils:
if channel:
chan = discord.utils.get(ctx.guild.channels, id=channel)
msg = ''
admin_roles = []
roles = await self.bot.db_con.fetchval(f'select admin_roles,rcon_admin_roles from guild_config '
f'where $1', ctx.guild.id)
f'where guild_id = $1', ctx.guild.id)
request_id = await self.bot.db_con.fetchval(f'select id from admin_requests where '
f'issuing_member_id = $1 and request_time = $2',
ctx.author.id, ctx.message.created_at)
for item in roles:
i = json.loads(item)
for j in i:
if i[j] not in admin_roles:
admin_roles.append(i[j])
admin_roles = json.loads(roles).values()
for role in admin_roles:
msg = '{0} {1}'.format(msg, discord.utils.get(ctx.guild.roles, id=role).mention)
msg += f"New Request ID: {request_id} " \
@@ -283,7 +281,7 @@ class Utils:
@admin.command(name='list', aliases=['lr'])
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def list_admin_requests(self, ctx, assigned_to: discord.Member=None):
"""Returns a list of all active Admin help requests for this guild
"""List of all active Admin help requests
If a user runs this command it will return all the requests that they have submitted and are still open.
- The [assigned_to] argument is ignored but will still give an error if an incorrect value is entered.
@@ -372,7 +370,7 @@ class Utils:
except ValueError:
await ctx.send(f'{request_id} is not a valid request id.')
else:
request = await self.bot.db_con.fetchval(f'select * from admin_requests where id = $1',
request = await self.bot.db_con.fetchrow(f'select * from admin_requests where id = $1',
request_id)
if request:
if request[3] == ctx.guild.id:
@@ -396,7 +394,8 @@ class Utils:
@commands.command(name='weather', aliases=['wu'])
@commands.cooldown(5, 15, type=commands.BucketType.default)
async def get_weather(self, ctx, *, location='palmer ak'):
"""Gets the weather data for the location provided,
"""Gets the weather data for the location given
If no location is included then it will get the weather for the Bot's home location.
"""
try:
@@ -433,7 +432,8 @@ class Utils:
@commands.command(name='localtime', aliases=['time', 'lt'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
async def get_localtime(self, ctx, timezone: str='Anchorage'):
"""Shows the current time localized to the timezone given
"""Shows the current time in the timezone given
This defaults to the Bot's local timezone of Anchorage Alaska USA if none are given."""
em = discord.Embed()
@@ -462,6 +462,13 @@ class Utils:
@commands.command(name='gettimein', aliases=['timein', 'gti'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
async def get_time_in_timezone(self, ctx, timezone: str='US/Eastern', *, time: str=None):
"""Convert the time provided to given timezone
Attempts to process the given time and timezone and convert into the given timezone.
Example: g$gti CET Friday June 15 2018 US/Alaska
This will be processed into a datetime with US/Alaska set as the timezone and will
convert it into CET timezone and return both times."""
em = discord.Embed()
if time is None:
@@ -521,7 +528,7 @@ class Utils:
@commands.command(name='purge', aliases=['clean', 'erase'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
async def purge_messages(self, ctx, number: int=20, member: discord.Member=None):
"""Gives Admin the ability to quickly clear messages from a channel
"""Purge messages from the current channel
By default this will only purge messages sent by Geeksbot and any messages that appear to
have called Geeksbot (aka start with one of the Geeksbot's prefixes for this Guild)
If you want to purge messages from a different user you must provide a number and member
@@ -565,7 +572,9 @@ class Utils:
@commands.command(name='purge_all', aliases=['cls', 'clear'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
async def purge_all(self, ctx, number: int=20, contents: str='all'):
"""Will delete all of the last <number> of messages from the channel
"""Purge all messages from the current channel
Will delete all of the last <number> of messages from the channel
If <contents> is not 'all' then only messages containing <contents>
will be deleted."""
if await checks.is_admin(self.bot, ctx):
@@ -596,6 +605,8 @@ class Utils:
@commands.command(hidden=True, name='sheets')
async def google_sheets(self, ctx, member: discord.Member):
"""Access Google Sheets and looks for the member"""
if await checks.is_admin(self.bot, ctx):
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
@@ -621,7 +632,10 @@ class Utils:
@commands.command(name='iss')
async def iss_loc(self, ctx):
"""WIP Locates the International Space Station and display on a map"""
"""Locate the International Space Station
Gets the location of the ISS and display on a
Blue Marble map."""
def gen_image(iss_loc):
lat = iss_loc['latitude']
lon = iss_loc['longitude']
@@ -646,6 +660,8 @@ class Utils:
@commands.command(name='location', aliases=['loc', 'map'])
async def map_location(self, ctx, *, location):
"""WIP Displays the given location on a map
Searches for the location provided and plots the Lat Long on a map.
Note: This is SLOW!!! Be prepared to wait up to a minute for the result"""
def draw_map(m, scale=1):
@@ -704,6 +720,7 @@ class Utils:
@commands.command(name='help', aliases=['h'])
@commands.cooldown(1, 5, commands.BucketType.user)
async def custom_help(self, ctx, *, command: str=None):
"""This help message"""
pag = utils.Paginator(self.bot, embed=True, max_line_length=48)
prefixes = await self.bot.get_custom_prefix(self.bot, ctx.message)
if isinstance(prefixes, list):
@@ -732,7 +749,7 @@ class Utils:
for com in sorted(command.commands, key=lambda x: x.name):
if not com.hidden:
pag.add(f'# {com.name}')
pag.add(f'> {com.short_doc}', truncate=True)
pag.add(f'> {com.short_doc}', truncate=True)
except AttributeError as e:
pass
pag.add('\uFFF7')