add weather command, move solar weather to weather cog,

change no subcommand in ae7qcog to send help.
This commit is contained in:
Abigail Gold 2019-10-28 00:23:56 -04:00
parent af3f341c27
commit 43120d9191
No known key found for this signature in database
GPG Key ID: 80A676456AB6B045
5 changed files with 143 additions and 22 deletions

View File

@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Rich lookup for AE7Q (callsigns only, more to come)
- Rich lookup for QRZ, if a QRZ subscription is present
- Timestamp and requester username and avatar are now shown on embeds
- Current and 3-Day Forecast terrestrial weather condition lookup commands
### Changed
- Rewrote code to take advantage of discord.py's cogs
- Moved most bot responses into embeds

View File

@ -31,8 +31,7 @@ class AE7QCog(commands.Cog):
async def _ae7q_lookup(self, ctx: commands.Context):
'''Look up a callsign, FRN, or Licensee ID on ae7q.com'''
if ctx.invoked_subcommand is None:
await ctx.send('Invalid ae7q command passed\nPossible commands:' +
'`call`, `frn`, `lic` or `licensee`.')
await ctx.send_help(ctx.command)
@_ae7q_lookup.command(name="call")
async def _ae7q_call(self, ctx: commands.Context, callsign: str):

View File

@ -56,25 +56,6 @@ class ImageCog(commands.Cog):
await ctx.send(embed=embed, file=img)
@commands.command(name="cond", aliases=['condx'])
async def _band_conditions(self, ctx: commands.Context):
'''Posts an image of HF Band Conditions.'''
with ctx.typing():
embed = discord.Embed(title='Current Solar Conditions',
colour=self.gs.colours.good,
timestamp=datetime.utcnow())
async with aiohttp.ClientSession() as session:
async with session.get('http://www.hamqsl.com/solarsun.php') as resp:
if resp.status != 200:
embed.description = 'Could not download file...'
embed.colour = self.gs.colours.bad
else:
data = io.BytesIO(await resp.read())
embed.set_image(url=f'attachment://condx.png')
embed.set_footer(text=ctx.author.name,
icon_url=str(ctx.author.avatar_url))
await ctx.send(embed=embed, file=discord.File(data, 'condx.png'))
@commands.command(name="grayline", aliases=['greyline', 'grey', 'gray', 'gl'])
async def _grayline(self, ctx: commands.Context):
'''Posts a map of the current greyline, where HF propagation is the best.'''

140
cogs/weathercog.py Normal file
View File

@ -0,0 +1,140 @@
"""
Weather cog for qrm
---
Copyright (C) 2019 Abigail Gold, 0x5c
This file is part of discord-qrmbot and is released under the terms of the GNU
General Public License, version 2.
"""
import io
from datetime import datetime
import re
import discord
import discord.ext.commands as commands
import aiohttp
class WeatherCog(commands.Cog):
wttr_units_regex = re.compile(r"\B-([cCfF])\b")
def __init__(self, bot: commands.Bot):
self.bot = bot
self.gs = bot.get_cog("GlobalSettings")
@commands.command(name="cond", aliases=['condx'])
async def _band_conditions(self, ctx: commands.Context):
'''Posts an image of HF Band Conditions.'''
with ctx.typing():
embed = discord.Embed(title='Current Solar Conditions',
colour=self.gs.colours.good,
timestamp=datetime.utcnow())
async with aiohttp.ClientSession() as session:
async with session.get('http://www.hamqsl.com/solarsun.php') as resp:
if resp.status != 200:
embed.description = 'Could not download file...'
embed.colour = self.gs.colours.bad
else:
data = io.BytesIO(await resp.read())
embed.set_image(url=f'attachment://condx.png')
embed.set_footer(text=ctx.author.name,
icon_url=str(ctx.author.avatar_url))
await ctx.send(embed=embed, file=discord.File(data, 'condx.png'))
@commands.group(name="weather", aliases=['wttr'])
async def _weather_conditions(self, ctx: commands.Context):
'''Posts an image of Local Weather Conditions from [wttr.in](http://wttr.in/).
*Supported location types:*
city name: `paris`
any location: `~Eiffel Tower`
Unicode name of any location in any language: `Москва`
airport code (3 letters): `muc`
domain name `@stackoverflow.com`
area codes: `12345`
GPS coordinates: `-78.46,106.79`
'''
if ctx.invoked_subcommand is None:
await ctx.send_help(ctx.command)
@_weather_conditions.command(name='forecast')
async def _weather_conditions_forecast(self, ctx: commands.Context, *, args: str):
'''Posts an image of Local Weather Conditions for the next three days from [wttr.in](http://wttr.in/).
See help for weather command for possible location types. Add a `-c` or `-f` to use Celcius or Fahrenheit.'''
with ctx.typing():
try:
units_arg = re.search(self.wttr_units_regex, args).group(1)
except AttributeError:
units_arg = ''
if units_arg.lower() == 'f':
units = 'u'
elif units_arg.lower() == 'c':
units = 'm'
else:
units = ''
loc = self.wttr_units_regex.sub('', args).strip()
embed = discord.Embed(title=f'Weather Forecast for {loc}',
description='Data from [wttr.in](http://wttr.in/).',
colour=self.gs.colours.good,
timestamp=datetime.utcnow())
loc = loc.replace(' ', '+')
async with aiohttp.ClientSession() as session:
async with session.get(f'http://wttr.in/{loc}_{units}pnFQ.png') as resp:
if resp.status != 200:
embed.description = 'Could not download file...'
embed.colour = self.gs.colours.bad
else:
data = io.BytesIO(await resp.read())
loc = loc.replace('+', '')
loc = loc.replace('@', '')
loc = loc.replace('~', '')
embed.set_image(url=f'attachment://{loc}_{units}pnFQ.png')
embed.set_footer(text=ctx.author.name,
icon_url=str(ctx.author.avatar_url))
await ctx.send(embed=embed, file=discord.File(data, f'{loc}_{units}pnFQ.png'))
@_weather_conditions.command(name='now')
async def _weather_conditions_now(self, ctx: commands.Context, *, args: str):
'''Posts an image of current Local Weather Conditions from [wttr.in](http://wttr.in/).
See help for weather command for possible location types. Add a `-c` or `-f` to use Celcius or Fahrenheit.'''
with ctx.typing():
try:
units_arg = re.search(self.wttr_units_regex, args).group(1)
except AttributeError:
units_arg = ''
if units_arg.lower() == 'f':
units = 'u'
elif units_arg.lower() == 'c':
units = 'm'
else:
units = ''
loc = self.wttr_units_regex.sub('', args).strip()
embed = discord.Embed(title=f'Current Weather for {loc}',
description='Data from [wttr.in](http://wttr.in/).',
colour=self.gs.colours.good,
timestamp=datetime.utcnow())
loc = loc.replace(' ', '+')
async with aiohttp.ClientSession() as session:
async with session.get(f'http://wttr.in/{loc}_0{units}pnFQ.png') as resp:
if resp.status != 200:
embed.description = 'Could not download file...'
embed.colour = self.gs.colours.bad
else:
data = io.BytesIO(await resp.read())
loc = loc.replace('+', '')
loc = loc.replace('@', '')
loc = loc.replace('~', '')
embed.set_image(url=f'attachment://{loc}_0{units}pnFQ.png')
embed.set_footer(text=ctx.author.name,
icon_url=str(ctx.author.avatar_url))
await ctx.send(embed=embed, file=discord.File(data, f'{loc}_0{units}pnFQ.png'))
def setup(bot: commands.Bot):
bot.add_cog(WeatherCog(bot))

View File

@ -27,7 +27,7 @@ owners_uids = (200102491231092736,)
# The cogs to load when running the bot.
cogs = ['basecog', 'morsecog', 'funcog', 'gridcog', 'hamcog', 'imagecog',
'studycog', 'ae7qcog', 'qrzcog']
'studycog', 'ae7qcog', 'qrzcog', 'weathercog']
# The text to put in the "playing" status.
game = 'with lids on 7.200'