qrm2/exts/morse.py
0x5c 976b3e8bf3
Improved error handling in commands
- Changed all "status != 200" to raise a custom exception
- Raise appropriate exceptions in 'grid'
- Removed command-specific error handling in 'extctl' commands

Fixes #146
2020-01-27 00:37:52 -05:00

83 lines
2.9 KiB
Python

"""
Morse Code extension for qrm
---
Copyright (C) 2019-2020 Abigail Gold, 0x5c
This file is part of discord-qrm2 and is released under the terms of the GNU
General Public License, version 2.
"""
import discord.ext.commands as commands
import common as cmn
from resources import morse
class MorseCog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
@commands.command(name="morse", aliases=['cw'], category=cmn.cat.ref)
async def _morse(self, ctx: commands.Context, *, msg: str):
"""Converts ASCII to international morse code."""
with ctx.typing():
result = ''
for char in msg.upper():
try:
result += morse.morse[char]
except KeyError:
result += '<?>'
result += ' '
embed = cmn.embed_factory(ctx)
embed.title = f'Morse Code for {msg}'
embed.description = '**' + result + '**'
embed.colour = cmn.colours.good
await ctx.send(embed=embed)
@commands.command(name="unmorse", aliases=['demorse', 'uncw', 'decw'], category=cmn.cat.ref)
async def _unmorse(self, ctx: commands.Context, *, msg: str):
'''Converts international morse code to ASCII.'''
with ctx.typing():
result = ''
msg0 = msg
msg = msg.split('/')
msg = [m.split() for m in msg]
for word in msg:
for char in word:
try:
result += morse.ascii[char]
except KeyError:
result += '<?>'
result += ' '
embed = cmn.embed_factory(ctx)
embed.title = f'ASCII for {msg0}'
embed.description = result
embed.colour = cmn.colours.good
await ctx.send(embed=embed)
@commands.command(name="cwweight", aliases=["weight", 'cww'], category=cmn.cat.ref)
async def _weight(self, ctx: commands.Context, *, msg: str):
'''Calculates the CW Weight of a callsign or message.'''
embed = cmn.embed_factory(ctx)
with ctx.typing():
msg = msg.upper()
weight = 0
for char in msg:
try:
cw_char = morse.morse[char].replace('-', '==')
weight += len(cw_char) * 2 + 2
except KeyError:
embed.title = 'Error in calculation of CW weight'
embed.description = f'Unknown character `{char}` in message'
embed.colour = cmn.colours.bad
await ctx.send(embed=embed)
return
embed.title = f'CW Weight of {msg}'
embed.description = f'The CW weight is **{weight}**'
embed.colour = cmn.colours.good
await ctx.send(embed=embed)
def setup(bot: commands.Bot):
bot.add_cog(MorseCog(bot))