mirror of
https://github.com/miaowware/qrm2.git
synced 2025-02-03 09:44:07 -05:00
add weather command, move solar weather to weather cog,
change no subcommand in ae7qcog to send help.
This commit is contained in:
parent
af3f341c27
commit
43120d9191
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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
140
cogs/weathercog.py
Normal 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))
|
@ -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'
|
||||
|
Loading…
Reference in New Issue
Block a user