From a2f179ae3504e80b39f9a9e1ba951a15a3bd7006 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 00:21:26 -0400 Subject: [PATCH 01/12] Add private option to /book --- ext/libcal.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/ext/libcal.py b/ext/libcal.py index 6d9b8c2..97a6497 100644 --- a/ext/libcal.py +++ b/ext/libcal.py @@ -15,17 +15,19 @@ from lib.ocr import get_room_data, NoMatchException plugin = lightbulb.Plugin("LibCal") config = load_config() + def add_rooms_to_embed(room_list: list[Room], embed: hikari.Embed): for room in room_list: embed.add_field(room.get_time_str(), room.number) + class BookingConfirmationView(miru.View): - def __init__(self, *, timeout: Optional[float] = 120, autodefer: bool = True, room_list: list[Room] = [], image: Resource | None = None) -> None: + def __init__(self, *, timeout: Optional[float] = 120, autodefer: bool = True, + room_list: list[Room] = [], image: Resource | None = None, private: bool = False + ) -> None: self.room_list = room_list - if image is not None: - self.image = image - else: - self.image = None + self.image = image + self.private = private super().__init__(timeout=timeout, autodefer=autodefer) @miru.button(label="Yes", style=hikari.ButtonStyle.SUCCESS) @@ -33,25 +35,31 @@ class BookingConfirmationView(miru.View): gcal = GoogleCalendarAPI() for room in self.room_list: await gcal.create_event(room.number, room.start_time, room.end_time) - embed = hikari.Embed(title="Rooms Booked!") - add_rooms_to_embed(self.room_list, embed) - await ctx.edit_response(embed=embed, components=[]) + embed = hikari.Embed(title="Rooms Booked!") + add_rooms_to_embed(self.room_list, embed) + await ctx.edit_response(embed=embed, components=[]) - thread_embed = hikari.Embed(title="Rooms were booked!") - thread_embed.set_author(name=ctx.user.username, icon=ctx.user.avatar_url) + thread_embed = hikari.Embed(title="Rooms were booked!") + thread_embed.set_author( + name=ctx.user.username, icon=ctx.user.avatar_url) + if not self.private: thread_embed.set_image(self.image) - add_rooms_to_embed(self.room_list, thread_embed) - await ctx.app.rest.create_message(config.discord_study_room_thread, embed=thread_embed) + add_rooms_to_embed(self.room_list, thread_embed) + await ctx.app.rest.create_message(config.discord_study_room_thread, embed=thread_embed) self.stop() @miru.button(label="No", style=hikari.ButtonStyle.DANGER) async def cancel_button(self, button: miru.Button, ctx: miru.Context) -> None: embed = hikari.Embed(title="Aborted!") + add_rooms_to_embed(self.room_list, embed) + embed.set_image(self.image) await ctx.edit_response(embed=embed, components=[]) self.stop() + @plugin.command @lightbulb.option("img", "image to check for events", type=hikari.Attachment, required=True) +@lightbulb.option("private", "if private, the bot will not share confirmation e-mails.", type=bool, default=False) @lightbulb.command("book", "add room bookings to Google Calendar", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommand) async def book(ctx: lightbulb.Context) -> None: @@ -70,7 +78,8 @@ async def book(ctx: lightbulb.Context) -> None: async def book_error_handler(event: lightbulb.CommandErrorEvent): print("ERROR TYPE:", type(event.exception)) if isinstance(event.exception.__cause__, NoMatchException): - embed = hikari.Embed(title="Huh, I can't read that", description="Could you try another picture?") + embed = hikari.Embed(title="Huh, I can't read that", + description="Could you try another picture?") await event.context.respond(embed=embed) else: embed = hikari.Embed( -- 2.34.1 From 7307aafaff2b26f20e7fa9223ef5758b84c94166 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 00:41:06 -0400 Subject: [PATCH 02/12] Add branch command --- ext/system.py | 73 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/ext/system.py b/ext/system.py index 1723e58..ff6cc0e 100644 --- a/ext/system.py +++ b/ext/system.py @@ -9,32 +9,39 @@ config = load_config() plugin = lightbulb.Plugin("SystemPlugin") + async def create_subprocess(*args): proc = await asyncio.create_subprocess_exec(*args, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE - ) + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) stdout, _ = await proc.communicate() return stdout.decode("utf-8").strip() + async def get_git_latest_commit_id(): return await create_subprocess("git", "rev-parse", "--short", "HEAD") + async def get_git_branch(): return await create_subprocess("git", "rev-parse", "--abbrev-ref", "HEAD") + async def get_git_remote(): remote = await create_subprocess("git", "branch", "-vv") return remote.split("[")[1].split("]")[0] + async def get_git_head_diff_branch(branch: str) -> str: # diff HEAD to remote return await create_subprocess("git", "diff", "head", branch) + async def get_git_index_diff_branch(branch: str) -> str: # diff index to remote return await create_subprocess("git", "diff", branch) + async def get_git_commits_ahead_behind(branch: str, remote: str) -> tuple[int, int]: # commits ahead/behind remote output = await create_subprocess("git", "rev-list", "--left-right", "--count", branch+"..."+remote) @@ -42,24 +49,30 @@ async def get_git_commits_ahead_behind(branch: str, remote: str) -> tuple[int, i commits_behind = int(output.split()[1]) return commits_ahead, commits_behind + async def get_git_dev(remote: str, branch: str) -> bool: # dev environment tests - if await get_git_head_diff_branch(remote) != "": # difference between HEAD and remote + # difference between HEAD and remote + if await get_git_head_diff_branch(remote) != "": return True elif config.git_branch != branch: # branch has been changed return True - elif await get_git_index_diff_branch(remote) != "": # difference between index and remote + # difference between index and remote + elif await get_git_index_diff_branch(remote) != "": return True - elif (await get_git_commits_ahead_behind(branch, remote))[0] > 0: # ahead in commits + # ahead in commits + elif (await get_git_commits_ahead_behind(branch, remote))[0] > 0: return True return False + async def get_git_update(dev_status: bool, branch, remote) -> bool: commits_behind, _ = await get_git_commits_ahead_behind(branch, remote) if not dev_status and commits_behind > 0: return True return False + async def get_git_status() -> dict: output = {} output["commit_id"] = await get_git_latest_commit_id() @@ -69,15 +82,17 @@ async def get_git_status() -> dict: output['update'] = await get_git_update(output['dev'], output['branch'], output['remote']) return output + @plugin.command @lightbulb.command("ping", "pong!", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommand) async def ping(ctx: lightbulb.Context) -> None: embed = hikari.Embed(title="Pong!", - description=f"latency: {round(ctx.bot.heartbeat_latency * 1000, ndigits=2)}ms" - ) + description=f"latency: {round(ctx.bot.heartbeat_latency * 1000, ndigits=2)}ms" + ) await ctx.respond(embed) + @plugin.command @lightbulb.add_checks(lightbulb.owner_only) @lightbulb.command("update", "update the bot!", ephemeral=True) @@ -86,11 +101,46 @@ async def update(ctx: lightbulb.Context) -> None: if (await get_git_status())['dev'] is False: await create_subprocess("git", "pull") embed = hikari.Embed(title="Restarting", - description="Restarting to load an update!" - ) + description="Restarting to load an update!" + ) await ctx.respond(embed) await ctx.bot.close() + +@plugin.command +@lightbulb.add_checks(lightbulb.owner_only) +@lightbulb.command("branch", "get or set the working branch the bot uses.", ephemeral=True) +@lightbulb.implements(lightbulb.SlashCommandGroup) +async def branch(ctx: lightbulb.Context) -> None: + output = await create_subprocess("git", "rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD") + embed = hikari.Embed(title="Current Branch", + description=f"Currently on branch '{output}'") + await ctx.respond(embed=embed) + + +@branch.child +@lightbulb.option("name", "name of the branch", type=str, required=True) +@lightbulb.command("switch", "switch branches") +@lightbulb.implements(lightbulb.SlashCommand) +async def switch(ctx: lightbulb.Context) -> None: + embed = hikari.Embed(title="Restarting", + description="Restarting to switch branches!" + ) + output = await create_subprocess("git", "switch", ctx.options.branch) + if "invalid reference" in output: # parsing output allows us more specificity. + embed.title = "Branch does not exist." + embed.description = "Please check your spelling." + await ctx.respond(embed) + return + elif "Already on" in output: + embed.title = f"Already on branch '{ctx.options.branch}'" + embed.description = "Just double checking, I presume?" + await ctx.respond(embed) + return + await ctx.respond(embed) + await ctx.bot.close() + + @plugin.command @lightbulb.command("info", "get bot information such as the version, and repository link.", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommand) @@ -101,12 +151,13 @@ async def info(ctx: lightbulb.Context) -> None: embed.add_field("Version", git_status['commit_id'], inline=True) embed.add_field("Branch", git_status['branch'], inline=True) embed.add_field("Remote", git_status['remote'], inline=True) - embed.add_field("In Dev-Env?", git_status['dev']) embed.add_field("Needs Update?", git_status['update']) await ctx.respond(embed) + def load(bot: lightbulb.BotApp): bot.add_plugin(plugin) + def unload(bot: lightbulb.BotApp): bot.remove_plugin(plugin) -- 2.34.1 From e31f066fd26d4eb7921f71222b5fc4d115ac61ad Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 00:51:31 -0400 Subject: [PATCH 03/12] fix branch subgroup --- ext/system.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/system.py b/ext/system.py index ff6cc0e..5932f6c 100644 --- a/ext/system.py +++ b/ext/system.py @@ -121,7 +121,7 @@ async def branch(ctx: lightbulb.Context) -> None: @branch.child @lightbulb.option("name", "name of the branch", type=str, required=True) @lightbulb.command("switch", "switch branches") -@lightbulb.implements(lightbulb.SlashCommand) +@lightbulb.implements(lightbulb.SlashSubGroup) async def switch(ctx: lightbulb.Context) -> None: embed = hikari.Embed(title="Restarting", description="Restarting to switch branches!" -- 2.34.1 From 05424d7949091e340ab2374e1556a4b269599745 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 00:57:18 -0400 Subject: [PATCH 04/12] fix subcommand --- ext/system.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ext/system.py b/ext/system.py index 5932f6c..5fd354b 100644 --- a/ext/system.py +++ b/ext/system.py @@ -112,6 +112,13 @@ async def update(ctx: lightbulb.Context) -> None: @lightbulb.command("branch", "get or set the working branch the bot uses.", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommandGroup) async def branch(ctx: lightbulb.Context) -> None: + pass + + +@branch.child +@lightbulb.command("get", "get the current branch") +@lightbulb.implements(lightbulb.SlashSubCommand) +async def branch_get(ctx: lightbulb.Context) -> None: output = await create_subprocess("git", "rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD") embed = hikari.Embed(title="Current Branch", description=f"Currently on branch '{output}'") @@ -121,8 +128,8 @@ async def branch(ctx: lightbulb.Context) -> None: @branch.child @lightbulb.option("name", "name of the branch", type=str, required=True) @lightbulb.command("switch", "switch branches") -@lightbulb.implements(lightbulb.SlashSubGroup) -async def switch(ctx: lightbulb.Context) -> None: +@lightbulb.implements(lightbulb.SlashSubCommand) +async def branch_switch(ctx: lightbulb.Context) -> None: embed = hikari.Embed(title="Restarting", description="Restarting to switch branches!" ) -- 2.34.1 From 33a1103f94cd6fbcee3ceed2e6014a844f83be1f Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:00:11 -0400 Subject: [PATCH 05/12] make branch commands ephemeral --- ext/system.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ext/system.py b/ext/system.py index 5fd354b..98f3325 100644 --- a/ext/system.py +++ b/ext/system.py @@ -109,14 +109,15 @@ async def update(ctx: lightbulb.Context) -> None: @plugin.command @lightbulb.add_checks(lightbulb.owner_only) -@lightbulb.command("branch", "get or set the working branch the bot uses.", ephemeral=True) +@lightbulb.command("branch", "get or set the working branch the bot uses.") @lightbulb.implements(lightbulb.SlashCommandGroup) async def branch(ctx: lightbulb.Context) -> None: - pass + pass # SlashCommandGroup body code isn't run @branch.child -@lightbulb.command("get", "get the current branch") +@lightbulb.add_checks(lightbulb.owner_only) +@lightbulb.command("get", "get the current branch", ephemeral=True) @lightbulb.implements(lightbulb.SlashSubCommand) async def branch_get(ctx: lightbulb.Context) -> None: output = await create_subprocess("git", "rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD") @@ -126,8 +127,9 @@ async def branch_get(ctx: lightbulb.Context) -> None: @branch.child +@lightbulb.add_checks(lightbulb.owner_only) @lightbulb.option("name", "name of the branch", type=str, required=True) -@lightbulb.command("switch", "switch branches") +@lightbulb.command("switch", "switch branches", ephemeral=True) @lightbulb.implements(lightbulb.SlashSubCommand) async def branch_switch(ctx: lightbulb.Context) -> None: embed = hikari.Embed(title="Restarting", -- 2.34.1 From f8a064565abf36bf9a80fa682eb6e39580e3504b Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:04:19 -0400 Subject: [PATCH 06/12] remove git_dev checks --- ext/system.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/ext/system.py b/ext/system.py index 98f3325..594e8a0 100644 --- a/ext/system.py +++ b/ext/system.py @@ -50,22 +50,6 @@ async def get_git_commits_ahead_behind(branch: str, remote: str) -> tuple[int, i return commits_ahead, commits_behind -async def get_git_dev(remote: str, branch: str) -> bool: - # dev environment tests - # difference between HEAD and remote - if await get_git_head_diff_branch(remote) != "": - return True - elif config.git_branch != branch: # branch has been changed - return True - # difference between index and remote - elif await get_git_index_diff_branch(remote) != "": - return True - # ahead in commits - elif (await get_git_commits_ahead_behind(branch, remote))[0] > 0: - return True - return False - - async def get_git_update(dev_status: bool, branch, remote) -> bool: commits_behind, _ = await get_git_commits_ahead_behind(branch, remote) if not dev_status and commits_behind > 0: @@ -78,7 +62,6 @@ async def get_git_status() -> dict: output["commit_id"] = await get_git_latest_commit_id() output["branch"] = await get_git_branch() output["remote"] = await get_git_remote() - output["dev"] = await get_git_dev(output['remote'], output['branch']) output['update'] = await get_git_update(output['dev'], output['branch'], output['remote']) return output @@ -98,8 +81,7 @@ async def ping(ctx: lightbulb.Context) -> None: @lightbulb.command("update", "update the bot!", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommand) async def update(ctx: lightbulb.Context) -> None: - if (await get_git_status())['dev'] is False: - await create_subprocess("git", "pull") + await create_subprocess("git", "pull") embed = hikari.Embed(title="Restarting", description="Restarting to load an update!" ) -- 2.34.1 From ca5866037697972b74143644c1fa76cc3ecba899 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:06:48 -0400 Subject: [PATCH 07/12] remove git dev --- ext/system.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/system.py b/ext/system.py index 594e8a0..8b50711 100644 --- a/ext/system.py +++ b/ext/system.py @@ -50,9 +50,9 @@ async def get_git_commits_ahead_behind(branch: str, remote: str) -> tuple[int, i return commits_ahead, commits_behind -async def get_git_update(dev_status: bool, branch, remote) -> bool: +async def get_git_update(branch, remote) -> bool: commits_behind, _ = await get_git_commits_ahead_behind(branch, remote) - if not dev_status and commits_behind > 0: + if commits_behind > 0: return True return False @@ -62,7 +62,7 @@ async def get_git_status() -> dict: output["commit_id"] = await get_git_latest_commit_id() output["branch"] = await get_git_branch() output["remote"] = await get_git_remote() - output['update'] = await get_git_update(output['dev'], output['branch'], output['remote']) + output['update'] = await get_git_update(output['branch'], output['remote']) return output -- 2.34.1 From ebd90927882b4e05fc9d5c12ed1027b0a647df73 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:09:56 -0400 Subject: [PATCH 08/12] fix get_git_remote with multiple branches --- ext/system.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/system.py b/ext/system.py index 8b50711..7c28030 100644 --- a/ext/system.py +++ b/ext/system.py @@ -29,7 +29,9 @@ async def get_git_branch(): async def get_git_remote(): remote = await create_subprocess("git", "branch", "-vv") - return remote.split("[")[1].split("]")[0] + for line in remote.split("\n"): + if "*" in line: + return line.split("[")[1].split("]")[0] async def get_git_head_diff_branch(branch: str) -> str: -- 2.34.1 From abd583401e2548c646fe2a26667b62966af28fb7 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:13:28 -0400 Subject: [PATCH 09/12] fix branch_switch --- ext/system.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/system.py b/ext/system.py index 7c28030..8541f13 100644 --- a/ext/system.py +++ b/ext/system.py @@ -95,11 +95,11 @@ async def update(ctx: lightbulb.Context) -> None: @lightbulb.add_checks(lightbulb.owner_only) @lightbulb.command("branch", "get or set the working branch the bot uses.") @lightbulb.implements(lightbulb.SlashCommandGroup) -async def branch(ctx: lightbulb.Context) -> None: +async def branch_group(ctx: lightbulb.Context) -> None: pass # SlashCommandGroup body code isn't run -@branch.child +@branch_group.child @lightbulb.add_checks(lightbulb.owner_only) @lightbulb.command("get", "get the current branch", ephemeral=True) @lightbulb.implements(lightbulb.SlashSubCommand) @@ -110,7 +110,7 @@ async def branch_get(ctx: lightbulb.Context) -> None: await ctx.respond(embed=embed) -@branch.child +@branch_group.child @lightbulb.add_checks(lightbulb.owner_only) @lightbulb.option("name", "name of the branch", type=str, required=True) @lightbulb.command("switch", "switch branches", ephemeral=True) @@ -119,7 +119,7 @@ async def branch_switch(ctx: lightbulb.Context) -> None: embed = hikari.Embed(title="Restarting", description="Restarting to switch branches!" ) - output = await create_subprocess("git", "switch", ctx.options.branch) + output = await create_subprocess("git", "switch", ctx.options.name) if "invalid reference" in output: # parsing output allows us more specificity. embed.title = "Branch does not exist." embed.description = "Please check your spelling." -- 2.34.1 From 1bd6e3709c0483302b25fcc020dfef2bc2ace2bb Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:20:01 -0400 Subject: [PATCH 10/12] add image to LibCal confirmation dialog --- ext/libcal.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/libcal.py b/ext/libcal.py index 97a6497..b1ad9d0 100644 --- a/ext/libcal.py +++ b/ext/libcal.py @@ -69,6 +69,7 @@ async def book(ctx: lightbulb.Context) -> None: add_rooms_to_embed(room_list, response) response.title = "Room Bookings" response.description = "Are the booking(s) correct?" + response.set_image(ctx.options.img) view = BookingConfirmationView(room_list=room_list, image=ctx.options.img) resp = await ctx.respond(response, components=view.build()) view.start(await resp.message()) -- 2.34.1 From 05acd6e4b09656c6f9d26fe3f9dae3fc23c4e74a Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:22:42 -0400 Subject: [PATCH 11/12] add git fetch before info is gathered --- ext/system.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/system.py b/ext/system.py index 8541f13..5e14498 100644 --- a/ext/system.py +++ b/ext/system.py @@ -138,6 +138,7 @@ async def branch_switch(ctx: lightbulb.Context) -> None: @lightbulb.command("info", "get bot information such as the version, and repository link.", ephemeral=True) @lightbulb.implements(lightbulb.SlashCommand) async def info(ctx: lightbulb.Context) -> None: + await create_subprocess("git", "fetch") # updates with remote git_status = await get_git_status() embed = hikari.Embed(title="About Me!") embed.add_field("Git Repository", config.git_url) -- 2.34.1 From 6f3ebbd45d841dbcb8b128901963a93e25b2e305 Mon Sep 17 00:00:00 2001 From: Riley Housden Date: Sat, 20 Aug 2022 01:28:51 -0400 Subject: [PATCH 12/12] pass private Option from /book command to View --- ext/libcal.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/libcal.py b/ext/libcal.py index b1ad9d0..141e53d 100644 --- a/ext/libcal.py +++ b/ext/libcal.py @@ -37,6 +37,7 @@ class BookingConfirmationView(miru.View): await gcal.create_event(room.number, room.start_time, room.end_time) embed = hikari.Embed(title="Rooms Booked!") add_rooms_to_embed(self.room_list, embed) + embed.set_image(self.image) await ctx.edit_response(embed=embed, components=[]) thread_embed = hikari.Embed(title="Rooms were booked!") @@ -70,7 +71,8 @@ async def book(ctx: lightbulb.Context) -> None: response.title = "Room Bookings" response.description = "Are the booking(s) correct?" response.set_image(ctx.options.img) - view = BookingConfirmationView(room_list=room_list, image=ctx.options.img) + view = BookingConfirmationView( + room_list=room_list, image=ctx.options.img, private=ctx.options.private) resp = await ctx.respond(response, components=view.build()) view.start(await resp.message()) -- 2.34.1