8 Commits

Author SHA1 Message Date
Abigail f4ed93dc76 bump version to 2.3.0 2020-03-30 19:00:38 -04:00
Abigail Gold 2cb4b03532 add phonetic weight command (#215)
Fixes #170

Co-authored-by: 0x5c <dev@0x5c.io>
2020-03-30 18:56:29 -04:00
Abigail Gold bc93462c29 convert all OrderedDicts to dictionaries (#214)
Fixes #184

Co-authored-by: 0x5c <dev@0x5c.io>
2020-03-30 18:54:33 -04:00
Abigail Gold 6867c45c8c add ?standards command for xkcd 927 (#213)
Fixes #187
2020-03-30 18:24:50 -04:00
Abigail dcbb7acab8 bump release to 2.2.3 2020-03-29 12:34:58 -04:00
Abigail Gold 3803ce6045 add git commit hash to file "git_commit" for automatically-built docker images (#211) 2020-03-29 12:34:12 -04:00
Abigail Gold 8ca4911072 make commands case-insensitive (#210)
Fixes #209
2020-03-28 19:07:23 -04:00
Abigail Gold 6e2468f04f create github action for docker image creation and publication (#206) 2020-03-28 18:18:29 -04:00
13 changed files with 204 additions and 71 deletions
+58
View File
@@ -0,0 +1,58 @@
name: Docker Build and Push
on:
push:
# Publish `master` as Docker `dev` image.
branches:
- master
# Publish `v*` tags as releases and as `latest`.
tags:
- v*
env:
IMAGE_NAME: qrm2
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build image
run: |
echo ${{ github.sha }} > git_commit
docker build . --file Dockerfile -t $IMAGE_NAME
- name: Log into Github Package Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin
- name: Log into Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image to registries
run: |
GITHUB_IMAGE_ID=docker.pkg.github.com/${{ github.repository }}/$IMAGE_NAME
DOCKER_IMAGE_ID=${{ secrets.DOCKER_USERNAME }}/$IMAGE_NAME
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
[[ "$VERSION" == "master" ]] && VERSION=dev
echo GITHUB_IMAGE_ID=$GITHUB_IMAGE_ID
echo DOCKER_IMAGE_ID=$DOCKER_IMAGE_ID
echo VERSION=$VERSION
# tag for Github Registry
docker tag $IMAGE_NAME $GITHUB_IMAGE_ID:$VERSION
[[ "$VERSION" != "dev" ]] && docker tag $IMAGE_NAME $GITHUB_IMAGE_ID:latest
docker push $GITHUB_IMAGE_ID
# tag for Docker Hub
docker tag $IMAGE_NAME $DOCKER_IMAGE_ID:$VERSION
[[ "$VERSION" != "dev" ]] && docker tag $IMAGE_NAME $DOCKER_IMAGE_ID:latest
docker push $DOCKER_IMAGE_ID
+15 -1
View File
@@ -7,6 +7,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased] ## [Unreleased]
## [2.3.0] - 2020-03-30
### Added
- `?phoneticweight` command, which calculates a message's length in syllables.
- `?standards` command to display [xkcd 927](https://xkcd.com/927/).
### Changed
- Python>=3.7 now required.
## [2.2.3] - 2020-03-29
### Fixed
- Commands are no longer case-sensitive.
## [2.2.2] - 2020-02-25 ## [2.2.2] - 2020-02-25
### Fixed ### Fixed
- Fixed issue where HamStudy questions with images would cause an error. - Fixed issue where HamStudy questions with images would cause an error.
@@ -87,7 +100,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 1.0.0 - 2019-07-31 [YANKED] ## 1.0.0 - 2019-07-31 [YANKED]
[Unreleased]: https://github.com/miaowware/qrm2/compare/v2.2.2...HEAD [Unreleased]: https://github.com/miaowware/qrm2/compare/v2.2.3...HEAD
[2.2.3]: https://github.com/miaowware/qrm2/releases/tag/v2.2.3
[2.2.2]: https://github.com/miaowware/qrm2/releases/tag/v2.2.2 [2.2.2]: https://github.com/miaowware/qrm2/releases/tag/v2.2.2
[2.2.1]: https://github.com/miaowware/qrm2/releases/tag/v2.2.1 [2.2.1]: https://github.com/miaowware/qrm2/releases/tag/v2.2.1
[2.2.0]: https://github.com/miaowware/qrm2/releases/tag/v2.2.0 [2.2.0]: https://github.com/miaowware/qrm2/releases/tag/v2.2.0
+2
View File
@@ -14,6 +14,8 @@ See [README-DOCKER.md](./README-DOCKER.md)
### Without Docker ### Without Docker
Requires Python 3.7 or newer.
Prep the environment. For more information on extra options, see the [quick-bot-no-pain Makefile documentation](https://github.com/0x5c/quick-bot-no-pain/blob/master/docs/makefile.md). Prep the environment. For more information on extra options, see the [quick-bot-no-pain Makefile documentation](https://github.com/0x5c/quick-bot-no-pain/blob/master/docs/makefile.md).
``` ```
+1 -1
View File
@@ -29,7 +29,7 @@ class AE7QCog(commands.Cog):
self.bot = bot self.bot = bot
self.session = aiohttp.ClientSession(connector=bot.qrm.connector) self.session = aiohttp.ClientSession(connector=bot.qrm.connector)
@commands.group(name="ae7q", aliases=["ae"], category=cmn.cat.lookup) @commands.group(name="ae7q", aliases=["ae"], case_insensitive=True, category=cmn.cat.lookup)
async def _ae7q_lookup(self, ctx: commands.Context): async def _ae7q_lookup(self, ctx: commands.Context):
"""Looks up a callsign, FRN, or Licensee ID on [ae7q.com](http://ae7q.com/).""" """Looks up a callsign, FRN, or Licensee ID on [ae7q.com](http://ae7q.com/)."""
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
+1 -2
View File
@@ -10,7 +10,6 @@ the GNU General Public License, version 2.
import random import random
import re import re
from collections import OrderedDict
from typing import Union from typing import Union
import discord import discord
@@ -189,7 +188,7 @@ class BaseCog(commands.Cog):
def parse_changelog(): def parse_changelog():
changelog = OrderedDict() changelog = {}
ver = "" ver = ""
heading = "" heading = ""
+5
View File
@@ -31,6 +31,11 @@ class FunCog(commands.Cog):
"""Returns xkcd: tar.""" """Returns xkcd: tar."""
await ctx.send("http://xkcd.com/1168") await ctx.send("http://xkcd.com/1168")
@commands.command(name="standards", category=cmn.cat.fun)
async def _standards(self, ctx: commands.Context):
"""Returns xkcd: Standards."""
await ctx.send("http://xkcd.com/927")
@commands.command(name="xd", hidden=True, category=cmn.cat.fun) @commands.command(name="xd", hidden=True, category=cmn.cat.fun)
async def _xd(self, ctx: commands.Context): async def _xd(self, ctx: commands.Context):
"""ecks dee""" """ecks dee"""
+20
View File
@@ -92,6 +92,26 @@ class HamCog(commands.Cog):
embed.colour = cmn.colours.good embed.colour = cmn.colours.good
await ctx.send(embed=embed) await ctx.send(embed=embed)
@commands.command(name="phoneticweight", aliases=["pw"], category=cmn.cat.ref)
async def _weight(self, ctx: commands.Context, *, msg: str):
"""Calculates the phonetic weight of a callsign or message."""
embed = cmn.embed_factory(ctx)
msg = msg.upper()
weight = 0
for char in msg:
try:
weight += phonetics.pweights[char]
except KeyError:
embed.title = "Error in calculation of phonetic weight"
embed.description = f"Unknown character `{char}` in message"
embed.colour = cmn.colours.bad
await ctx.send(embed=embed)
return
embed.title = f"Phonetic Weight of {msg}"
embed.description = f"The phonetic weight is **{weight}**"
embed.colour = cmn.colours.good
await ctx.send(embed=embed)
def setup(bot: commands.Bot): def setup(bot: commands.Bot):
bot.add_cog(HamCog(bot)) bot.add_cog(HamCog(bot))
+18 -22
View File
@@ -8,7 +8,6 @@ the GNU General Public License, version 2.
""" """
from collections import OrderedDict
from io import BytesIO from io import BytesIO
import aiohttp import aiohttp
@@ -159,27 +158,24 @@ def qrz_process_info(data: dict):
else: else:
lotw = "Unknown" lotw = "Unknown"
return OrderedDict([("Name", name), return {"Name": name,
("Country", data.get("country", None)), "Country": data.get("country", None),
("Address", address), "Address": address,
("Grid Square", data.get("grid", None)), "Grid Square": data.get("grid", None),
("County", data.get("county", None)), "County": data.get("county", None),
("CQ Zone", data.get("cqzone", None)), "CQ Zone": data.get("cqzone", None),
("ITU Zone", data.get("ituzone", None)), "ITU Zone": data.get("ituzone", None),
("IOTA Designator", data.get("iota", None)), "IOTA Designator": data.get("iota", None),
("Expires", data.get("expdate", None)), "Expires": data.get("expdate", None),
("Aliases", data.get("aliases", None)), "Aliases": data.get("aliases", None),
("Previous Callsign", data.get("p_call", None)), "Previous Callsign": data.get("p_call", None),
("License Class", data.get("class", None)), "License Class": data.get("class", None),
("Trustee", data.get("trustee", None)), "Trustee": data.get("trustee", None),
("eQSL?", eqsl), "eQSL?": eqsl,
("Paper QSL?", mqsl), "Paper QSL?": mqsl,
("LotW?", lotw), "LotW?": lotw,
("QSL Info", data.get("qslmgr", None)), "QSL Info": data.get("qslmgr", None),
("CQ Zone", data.get("cqzone", None)), "Born": data.get("born", None)}
("ITU Zone", data.get("ituzone", None)),
("IOTA Designator", data.get("iota", None)),
("Born", data.get("born", None))])
def setup(bot): def setup(bot):
+1 -1
View File
@@ -40,7 +40,7 @@ class WeatherCog(commands.Cog):
embed.set_image(url="attachment://condx.png") embed.set_image(url="attachment://condx.png")
await ctx.send(embed=embed, file=discord.File(data, "condx.png")) await ctx.send(embed=embed, file=discord.File(data, "condx.png"))
@commands.group(name="weather", aliases=["wttr"], category=cmn.cat.weather) @commands.group(name="weather", aliases=["wttr"], case_insensitive=True, category=cmn.cat.weather)
async def _weather_conditions(self, ctx: commands.Context): async def _weather_conditions(self, ctx: commands.Context):
"""Gets local weather conditions from [wttr.in](http://wttr.in/). """Gets local weather conditions from [wttr.in](http://wttr.in/).
+1 -1
View File
@@ -12,5 +12,5 @@ authors = ("@ClassAbbyAmplifier#2229", "@0x5c#0639")
description = """A bot with various useful ham radio-related functions, written in Python.""" description = """A bot with various useful ham radio-related functions, written in Python."""
license = "Released under the GNU General Public License v2" license = "Released under the GNU General Public License v2"
contributing = "Check out the source on GitHub, contributions welcome: https://github.com/miaowware/qrm2" contributing = "Check out the source on GitHub, contributions welcome: https://github.com/miaowware/qrm2"
release = "2.2.2" release = "2.3.0"
bot_server = "https://discord.gg/Ntbg3J4" bot_server = "https://discord.gg/Ntbg3J4"
+3 -3
View File
@@ -45,8 +45,8 @@ loop = asyncio.get_event_loop()
connector = loop.run_until_complete(conn.new_connector()) connector = loop.run_until_complete(conn.new_connector())
bot = commands.Bot(command_prefix=opt.prefix, bot = commands.Bot(command_prefix=opt.prefix,
description=info.description, case_insensitive=True,
help_command=commands.MinimalHelpCommand(), description=info.description, help_command=commands.MinimalHelpCommand(),
loop=loop, loop=loop,
connector=connector) connector=connector)
@@ -82,7 +82,7 @@ async def _shutdown_bot(ctx: commands.Context):
await bot.logout() await bot.logout()
@bot.group(name="extctl", aliases=["ex"], category=cmn.cat.admin) @bot.group(name="extctl", aliases=["ex"], case_insensitive=True, category=cmn.cat.admin)
@commands.check(cmn.check_if_owner) @commands.check(cmn.check_if_owner)
async def _extctl(ctx: commands.Context): async def _extctl(ctx: commands.Context):
"""Extension control commands. """Extension control commands.
+39 -40
View File
@@ -8,49 +8,48 @@ the GNU General Public License, version 2.
""" """
from collections import OrderedDict
us_calls_title = "Valid US Vanity Callsigns" us_calls_title = "Valid US Vanity Callsigns"
us_calls_desc = ("#x# is the number of letters in the prefix and suffix of a callsign. " us_calls_desc = ("#x# is the number of letters in the prefix and suffix of a callsign. "
"E.g., WY4RC would be a 2x2 callsign, with prefix WY and suffix RC.") "E.g., WY4RC would be a 2x2 callsign, with prefix WY and suffix RC.")
us_calls = OrderedDict([("**Group A** (Extra Only)", ("**Any:** K, N, W (1x2)\n" us_calls = {
" AA-AL, KA-KZ, NA-NZ, WA-WZ (2x1)\n" "**Group A** (Extra Only)": ("**Any:** K, N, W (1x2)\n"
" AA-AL (2x2)\n" " AA-AL, KA-KZ, NA-NZ, WA-WZ (2x1)\n"
"*Except*\n" " AA-AL (2x2)\n"
"**Alaska:** AL, KL, NL, WL (2x1)\n" "*Except*\n"
"**Caribbean:** KP, NP, WP (2x1)\n" "**Alaska:** AL, KL, NL, WL (2x1)\n"
"**Pacific:** AH, KH, NH, WH (2x1)")), "**Caribbean:** KP, NP, WP (2x1)\n"
("**Group B** (Advanced and Extra Only)", ("**Any:** KA-KZ, NA-NZ, WA-WZ (2x2)\n" "**Pacific:** AH, KH, NH, WH (2x1)"),
"*Except*\n" "**Group B** (Advanced and Extra Only)": ("**Any:** KA-KZ, NA-NZ, WA-WZ (2x2)\n"
"**Alaska:** AL (2x2)\n" "*Except*\n"
"**Caribbean:** KP (2x2)\n" "**Alaska:** AL (2x2)\n"
"**Pacific:** AH (2x2)")), "**Caribbean:** KP (2x2)\n"
("**Group C** (Technician, General, Advanced, Extra Only)", ("**Any Region:** K, N, W (1x3)\n" "**Pacific:** AH (2x2)"),
"*Except*\n" "**Group C** (Technician, General, Advanced, Extra Only)": ("**Any Region:** K, N, W (1x3)\n"
"**Alaska:** KL, NL, WL (2x2)\n" "*Except*\n"
"**Caribbean:** NP, WP (2x2)\n" "**Alaska:** KL, NL, WL (2x2)\n"
"**Pacific:** KH, NH, WH (2x2)")), "**Caribbean:** NP, WP (2x2)\n"
("**Group D** (Any License Class)", ("**Any Region:** KA-KZ, WA-WZ (2x3)\n" "**Pacific:** KH, NH, WH (2x2)"),
"*Except*\n" "**Group D** (Any License Class)": ("**Any Region:** KA-KZ, WA-WZ (2x3)\n"
"**Alaska:** KL, WL (2x3)\n" "*Except*\n"
"**Caribbean:** KP, WP (2x3)\n" "**Alaska:** KL, WL (2x3)\n"
"**Pacific:** KH, WH (2x3)")), "**Caribbean:** KP, WP (2x3)\n"
("**Unavailable**", ("- KA2AA-KA9ZZ: US Army in Japan\n" "**Pacific:** KH, WH (2x3)"),
"- KC4AAA-KC4AAF: NSF in Antartica\n" "**Unavailable**": ("- KA2AA-KA9ZZ: US Army in Japan\n"
"- KC4USA-KC4USZ: US Navy in Antartica\n" "- KC4AAA-KC4AAF: NSF in Antartica\n"
"- KG4AA-KG4ZZ: US Navy in Guantanamo Bay\n" "- KC4USA-KC4USZ: US Navy in Antartica\n"
"- KL9KAA-KL9KHZ: US military in Korea\n" "- KG4AA-KG4ZZ: US Navy in Guantanamo Bay\n"
"- KC6AA-KC6ZZ: Former US (Eastern and Western Caroline Islands), " "- KL9KAA-KL9KHZ: US military in Korea\n"
"now Federated States of Micronesia (V6) and Republic of Palau (T8)\n" "- KC6AA-KC6ZZ: Former US (Eastern and Western Caroline Islands), "
"- KX6AA-KX6ZZ: Former US (Marshall Islands), " "now Federated States of Micronesia (V6) and Republic of Palau (T8)\n"
"now Republic of the Marshall Islands (V73)\n" "- KX6AA-KX6ZZ: Former US (Marshall Islands), "
"- Any suffix SOS or QRA-QUZ\n" "now Republic of the Marshall Islands (V73)\n"
"- Any 2x3 with X as the first suffix letter\n" "- Any suffix SOS or QRA-QUZ\n"
"- Any 2x3 with AF, KF, NF, or WF prefix and suffix EMA: FEMA\n" "- Any 2x3 with X as the first suffix letter\n"
"- Any 2x3 with AA-AL, NA-NZ, WC, WK, WM, WR, or WT prefix: \"Group X\"\n" "- Any 2x3 with AF, KF, NF, or WF prefix and suffix EMA: FEMA\n"
"- Any 2x1, 2x2, or 2x3 with KP, NP, WP prefix and 0, 6, 7, 8, 9 number\n" "- Any 2x3 with AA-AL, NA-NZ, WC, WK, WM, WR, or WT prefix: \"Group X\"\n"
"- Any 1x1 callsign: Special Event"))]) "- Any 2x1, 2x2, or 2x3 with KP, NP, WP prefix and 0, 6, 7, 8, 9 number\n"
"- Any 1x1 callsign: Special Event")
}
# format: country: (title, description, text) # format: country: (title, description, text)
options = {"us": (us_calls_title, us_calls_desc, us_calls)} options = {"us": (us_calls_title, us_calls_desc, us_calls)}
+40
View File
@@ -36,3 +36,43 @@ phonetics = {
"y": "yankee", "y": "yankee",
"z": "zulu" "z": "zulu"
} }
pweights = {
"A": 2,
"B": 2,
"C": 2,
"D": 2,
"E": 2,
"F": 2,
"G": 1,
"H": 2,
"I": 3,
"J": 3,
"K": 2,
"L": 2,
"M": 1,
"N": 3,
"O": 2,
"P": 2,
"Q": 2,
"R": 3,
"S": 3,
"T": 2,
"U": 3,
"V": 2,
"W": 2,
"X": 2,
"Y": 2,
"Z": 2,
"0": 2,
"1": 1,
"2": 1,
"3": 1,
"4": 1,
"5": 1,
"6": 1,
"7": 2,
"8": 1,
"9": 2,
"/": 1,
}