async def on_task_due(self, guild_id: int, task: dict): """This fires when a task is due.""" projects = ProjectHandler(guild_id) project = projects.find_project(task.get('project')) completed = self.bot.db("guilds").find( str(guild_id)).get('projects')[project.get("number")].get("tasks")[ task.get("number")].get("completed") if completed: return channel = await self.bot.fetch_channel(int(project.get("channel"))) members = self.bot.db("guilds").find( str(guild_id)).get('projects')[project.get("number")].get("tasks")[ task.get("number")].get("assigned") members = [(await self.bot.fetch_user(member)) for member in members] new_value = task.get("value") * 10 / 100 if new_value < 1: new_value = 1 guild = self.bot.db("guilds").find(str(guild_id)) guild.get('projects')[project.get("number")].get("tasks")[task.get( "number")]["value"] = new_value self.bot.db("guilds").update(str(guild_id), guild) task = guild.get('projects')[project.get("number")].get("tasks")[ task.get("number")] task_name = task.get("name") task_value = task.get("value") await channel.send(f"**> Task bounty update:** Task `{task_name}` " f"is now valued at `{task_value}` points.") for member in members: await member.send(f":alarm_clock: The task {task_name}" " is now overdue. And as such, the bounty is " "10% of what it originally was." f" Bounty now: `{task_value}` points.")
async def on_task_revoke(self, guild_id: int, task: dict) -> None: """This is fired when someone marks a task as incomplete.""" projects = ProjectHandler(guild_id) pointhandler = Points() all_logs = list(self.bot.db("logs").find_all()) for member in task.get("assigned"): task_name = task.get("name") logs = list( filter( lambda all_logs: all_logs['name'] == f"point_addition_{member}_{task_name}", all_logs)) points_gained = [log.get("amount") for log in logs] for points in points_gained: pointhandler.remove_points(guild_id, task, points) project = projects.find_project(task.get("project")) channel = await self.bot.fetch_channel(int(project.get("channel"))) task_name = task.get("name") task_reward = self.bot.db("guilds").find(guild_id).get("projects")[ project.get('number')].get("tasks")[task.get("number")]["value"] message = await channel.fetch_message( int(projects.find_project(task.get("project")).get("message"))) await message.edit( content=projects.project_progress_bar(task.get("project"))) return await channel.send(f"**> Task revoked:** The task `{task_name}`" " was marked as incomplete. " f"The bounty of `{task_reward}` " "points is back up.")
async def on_task_complete(self, guild_id: int, task: dict) -> None: """This event is fired on the completion of a task.""" pointhandler = Points() projects = ProjectHandler(guild_id) project = projects.find_project(task.get("project")) value = self.bot.db("guilds").find(guild_id).get("projects")[ project.get('number')].get("tasks")[task.get("number")]["value"] # start_timestamp = (datetime.datetime.now() - # task.get("start_timestamp")).total_seconds() # end_timestamp = (task.get("end_timestamp") - # datetime.datetime.now()).total_seconds() pointhandler.add_points(guild_id, task, value) channel = await self.bot.fetch_channel(int(project.get("channel"))) task_name = task.get("name") value = self.bot.db("guilds").find(guild_id).get("projects")[ project.get('number')].get("tasks")[task.get("number")]["value"] message = await channel.fetch_message( int(projects.find_project(task.get("project")).get("message"))) await message.edit( content=projects.project_progress_bar(task.get("project"))) return await channel.send(f"**> Task completion:** The task " f"`{task_name}` was completed and " f" the bounty of `{value}` " "points has been claimed!")
async def on_task_member_update(self, task: dict, guild_id: int, members: list) -> None: """This sends a message when a member is added""" projects = ProjectHandler(guild_id) project = projects.find_project(task.get("project")) guild = (await self.bot.fetch_guild(guild_id)) channel = await self.bot.fetch_channel(int(project.get("channel"))) members = [(await guild.fetch_member(member)) for member in members] count = len(members) task_name = task.get("name") if count == 1: member = members[0] return await channel.send(f"**> Member Update:** `{member}` " f"was added to `{task_name}`.") if count == 2: return await channel.send(f"**> Member Update:** `{members[0]}` " f"and `{members[1]}` were added " f"to `{task_name}`.") else: last_member = members[count - 1] members = members.pop(count - 1) string = "`" members = string + "`, ".join(str(x) for x in members) + string members = members + f" and `{last_member}``" return await channel.send(f"**> Member Update:** {members}" f" were added to `{task_name}`.")
async def on_task_create(self, guild_id: int, task: dict) -> None: """Sends a message on the creation of a task to the project channel.""" projects = ProjectHandler(guild_id) project = projects.find_project(task.get("project")) channel = await self.bot.fetch_channel(int(project.get("channel"))) task_name = task.get("name") task_reward = task.get("value") message = await channel.fetch_message( int(projects.find_project(task.get("project")).get("message"))) await message.edit( content=projects.project_progress_bar(task.get("project"))) await channel.send(f"**> Task creation:** The task `{task_name}` " "was created. Bounty for completion: " f"`{task_reward}` points!")
async def projects(self, ctx) -> None: """Project related commands.""" ctx.projects = ProjectHandler(ctx.guild.id)