At its starting state it would accept following commands: - !getunits <activity>: Would send a JSON file with activity units via Discord message. Those files are responsible for setting up a fitness activity to log. - !getlog <activity>: Would send a CSV file with fitness activity log. Those files contain records with timestamp, username, and reported activity measurements. - !<activity> <value> <unit (optional)>: Would create a record with your fitness activity in corresponding CSV log file. If you choose to report different unit (feet, for example), it is going to convert as specified in its corresponding JSON file with units (to meters, for example) if the activity specified as convertable. Non-convertable activities' units are ignored.
79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import os
|
|
import discord
|
|
from redbot.core import Config, commands
|
|
from activity_logger import log_activity, activity_log_path, activity_units_path
|
|
|
|
|
|
|
|
class FitnessCog(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
# Some hardcoded values, this probably should be changed with redbot config. IDK how to use it or what's in it.
|
|
default_threads = "1457402451530350727,1328363409648910356"
|
|
self.threads_id = list(map(int, os.getenv("THREADS_ID", default_threads).split(",")))
|
|
self.confirm_reactions = os.getenv("CONFIRMATION_REACTIONS", "🐈💨")
|
|
|
|
@commands.Cog.listener()
|
|
async def on_message(self, message):
|
|
if message.author.bot:
|
|
return
|
|
if message.channel.id not in self.threads_id:
|
|
return
|
|
if not message.content.startswith("!"):
|
|
return
|
|
|
|
# region Fitness commands
|
|
if message.content.startswith("!getunits"):
|
|
await self.get_units_file(message)
|
|
return
|
|
if message.content.startswith("!getlog"):
|
|
await self.get_log_file(message)
|
|
return
|
|
# Make sure this one is past every other ! commands
|
|
await self.fitness_activity_log(message)
|
|
return
|
|
# endregion Fitness commands
|
|
|
|
# region Fitness commands functions
|
|
@staticmethod
|
|
async def get_units_file(message: discord.Message):
|
|
try:
|
|
raw = message.content[1:].lower().strip().split(" ", 1)
|
|
filename = activity_units_path(raw[1])
|
|
await message.channel.send(file=discord.File(fp=filename))
|
|
except Exception as e:
|
|
await message.channel.send(str(e))
|
|
|
|
@staticmethod
|
|
async def get_log_file(message: discord.Message):
|
|
try:
|
|
raw = message.content[1:].lower().strip().split(" ", 1)
|
|
filename = activity_log_path(raw[1])
|
|
await message.channel.send(file=discord.File(fp=filename))
|
|
except Exception as e:
|
|
await message.channel.send(str(e))
|
|
|
|
async def log_fitness(self, message):
|
|
try:
|
|
raw = message.content[1:].lower().strip().split(" ", 2)
|
|
|
|
timestamp = int(message.created_at.timestamp())
|
|
username = message.author.name
|
|
activity = raw[0]
|
|
value = float(raw[1])
|
|
unit = raw[2] if len(raw) > 2 else "m"
|
|
|
|
log_activity(timestamp, username, activity, value, unit)
|
|
|
|
for r in self.confirm_reactions:
|
|
await message.add_reaction(r)
|
|
|
|
except Exception as e:
|
|
await message.reply(str(e))
|
|
# endregion Fitness commands functions
|
|
|
|
|
|
def setup(bot):
|
|
bot.add_cog(FitnessCog(bot))
|
|
|