From 083e60aa65fdf13fb8544ccc1d1c94627e739d83 Mon Sep 17 00:00:00 2001 From: Loup <90267658+Loup-Garou911XD@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:50:31 +0530 Subject: [PATCH 1/9] Add files via upload --- plugins/utilities/share_replay.py | 199 +++++++++++++++++++++++------- 1 file changed, 155 insertions(+), 44 deletions(-) diff --git a/plugins/utilities/share_replay.py b/plugins/utilities/share_replay.py index 705b587..f550fa9 100644 --- a/plugins/utilities/share_replay.py +++ b/plugins/utilities/share_replay.py @@ -15,7 +15,6 @@ from bastd.ui.popup import PopupWindow # mod by ʟօʊքɢǟʀօʊ # export replays to mods folder and share with your friends or have a backup - def Print(*args, color=None, top=None): out = "" for arg in args: @@ -23,7 +22,6 @@ def Print(*args, color=None, top=None): out += a ba.screenmessage(out, color=color, top=top) - def cprint(*args): out = "" for arg in args: @@ -31,24 +29,27 @@ def cprint(*args): out += a _ba.chatmessage(out) - +title="SHARE REPLAY" internal_dir = path.join("ba_data", "..", "..", "..", "files", "bombsquad_config", "replays" + sep) external_dir = path.join(_ba.env()["python_directory_user"], "replays"+sep) + # colors pink = (1, 0.2, 0.8) green = (0.4, 1, 0.4) red = (1, 0, 0) +blue=(0.26, 0.65,0.94) if not path.exists(external_dir): mkdir(external_dir) Print("You are ready to share replays", color=pink) + class Help(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale - self.width = 800 + self.width = 1000 self.height = 300 PopupWindow.__init__(self, @@ -58,7 +59,24 @@ class Help(PopupWindow): ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close) ba.textwidget(parent=self.root_widget, position=(0, self.height * 0.6), - text=f"•Replays are exported to\n {external_dir}\n•Importing replay and other features comming in v1.2") + text=f"•Replays are exported to\n {external_dir}\n•Copy replays to the above folder to be able to import them into the game") + + def close(self): + ba.playsound(ba.getsound('swish')) + ba.containerwidget(edit=self.root_widget, transition="out_right",) + +class SyncConfirmation(PopupWindow): + def __init__(self): + uiscale = ba.app.ui.uiscale + self.width = 1000#h-hhhhhhhhhhh-----to completeh-hh-hhhhh- + self.height = 300 + PopupWindow.__init__(self, + position=(0.0, 0.0), + size=(self.width, self.height), + scale=1.2,) + ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close) + ba.buttonwidget(parent=self.root_widget,label="cancel",size=e) + ba.buttonwidget(parent=self.root_widget,label="continue") def close(self): ba.playsound(ba.getsound('swish')) @@ -67,17 +85,56 @@ class Help(PopupWindow): class SettingWindow(): def __init__(self): + global internal self.draw_ui() - self.selected_widget = None self.selected_name = None - - def on_select_text(self, widget, name): - if self.selected_widget is not None: - ba.textwidget(edit=self.selected_widget, color=(1, 1, 1)) + internal=True + self.on_tab_select(internal) + + def on_select_text(self, widget,name): + existing_widgets=self.scroll2.get_children() + for i in existing_widgets: + ba.textwidget(edit=i,color=(1,1,1)) ba.textwidget(edit=widget, color=(1, 1, 0)) - self.selected_name = name - self.selected_widget = widget - + self.selected_name=name + + + def on_tab_select(self,_internal): + global internal + internal=_internal + if internal==True: + dir_list=listdir(internal_dir) + ba.buttonwidget(edit=self.share_button,label="Export",icon=ba.gettexture("upButton"),) + sel=self.internal_tab + unsel=self.external_tab + else: + dir_list=listdir(external_dir) + ba.buttonwidget(edit=self.share_button,label="Import",icon=ba.gettexture("downButton"),) + sel= self.external_tab + unsel= self.internal_tab + + ba.buttonwidget(edit=sel,texture=ba.gettexture("circleShadow")) + ba.buttonwidget(edit=unsel,texture=ba.gettexture("nub")) + + dir_list=sorted(dir_list) + existing_widgets=self.scroll2.get_children() + if existing_widgets: + for i in existing_widgets: + i.delete() + height = 900 + for i in dir_list: + height -= 40 + a = i + i = ba.textwidget( + parent=self.scroll2, + size=(500, 50), + text=i.split(".")[0], + position=(10, height), + selectable=True, + max_chars=40, + click_activate=True,) + ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i , a)) + def draw_ui(self): self.uiscale = ba.app.ui.uiscale self.root = ba.Window(ba.containerwidget( @@ -91,28 +148,71 @@ class SettingWindow(): selectable=False, h_align="center", v_align="center", - text="ShareReplay", + text=title, color=green) ba.buttonwidget( parent=self.root, - position=(400, 580), + position=(450, 580), size=(35, 35), texture=ba.gettexture("achievementEmpty"), label="", on_activate_call=Help) - - ba.buttonwidget( + + internal_tab_pos=85,400 + internal_tab_size=120,80 + external_tab_pos=85,300 + external_tab_size=120,80 + + self.internal_tab=ba.buttonwidget( parent=self.root, - position=(770, 460), - size=(90, 70), + position=internal_tab_pos, + size=internal_tab_size, + button_type="square", + label="internal", + text_scale=2, + color=blue, + texture=ba.gettexture("circleShadow")) + + self.external_tab=ba.buttonwidget( + parent=self.root, + position=external_tab_pos, + size=external_tab_size, + button_type="square", + label="external", + text_scale=2, + color=blue, + texture=ba.gettexture("nub")) + + ba.buttonwidget(edit=self.internal_tab,on_activate_call=ba.Call(self.on_tab_select,True)) + ba.buttonwidget(edit=self.external_tab,on_activate_call=ba.Call(self.on_tab_select,False)) + + + self.share_button=ba.buttonwidget( + parent=self.root, + position=(720, 400), + size=(110, 50), scale=1.5, + button_type="square", label="EXPORT", - on_activate_call=self.export) + text_scale=2, + icon=ba.gettexture("upButton"), + on_activate_call=self.share) + + sync_button=ba.buttonwidget( + parent=self.root, + position=(720, 300), + size=(110, 50), + scale=1.5, + button_type="square", + label="SYNC", + text_scale=2, + icon=ba.gettexture("ouyaYButton"), + on_activate_call=self.sync) self.close_button = ba.buttonwidget( parent=self.root, - position=(820, 590), + position=(800, 590), size=(35, 35), texture=ba.gettexture("crossOut"), label="", @@ -124,33 +224,41 @@ class SettingWindow(): scroll = ba.scrollwidget( parent=self.root, size=(500, 400), - position=(200, 150)) - self.scroll = ba.columnwidget(parent=scroll, size=( - 500, 900), selection_loops_to_parent=True, single_depth=True) - - height = 900 - for i in listdir(internal_dir): - height -= 40 - a = i - i = ba.textwidget( - parent=self.scroll, - size=(500, 50), - text=i.split(".")[0], - position=(10, height), - selectable=True, - max_chars=40, - click_activate=True,) - - ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i, a)) - - def export(self): + position=(200, 100),) + self.scroll2 = ba.columnwidget(parent=scroll, size=( + 500, 900)) + + def share(self): if self.selected_name is None: Print("Select a replay", color=red) return - copy(internal_dir+"/"+self.selected_name, external_dir+"/"+self.selected_name) + if internal:self.export() + else:self.importx() + # image={"texture":ba.gettexture("bombColor"),"tint_texture":None,"tint_color":None,"tint2_color":None}) + + def sync(self): + internal_list=listdir(internal_dir) + external_list=listdir(external_dir) + for i in internal_list: + copy(internal_dir+sep+i, external_dir+sep+i) + for i in external_list: + if i in internal_list: + pass + else: + copy(external_dir+sep+i, internal_dir+sep+i) + Print("Synced all replays",color=pink) + + def export(self): + copy(internal_dir+self.selected_name, external_dir+self.selected_name) + cprint(internal_dir+self.selected_name) Print(self.selected_name[0:-4]+" exported", top=True, color=pink) - + + def importx(self): + copy(external_dir+self.selected_name, internal_dir+self.selected_name) + cprint(external_dir+self.selected_name) + Print(self.selected_name[0:-4]+" imported", top=True, color=green) + def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root, transition="out_right",) @@ -175,7 +283,7 @@ def new_init(self, transition="in_right", origin_widget=None): color=green, icon=ba.gettexture('usersButton'), iconscale=1.5, - label="SHARE REPLAY", + label=title, on_activate_call=SettingWindow) @@ -190,3 +298,6 @@ class Loup(ba.Plugin): def show_settings_ui(self, button): SettingWindow() + + def on_plugin_manager_prompt(self): + SettingWindow() From a0b3f419514dd320682ca58bff7c3e047ae32b28 Mon Sep 17 00:00:00 2001 From: Loup <90267658+Loup-Garou911XD@users.noreply.github.com> Date: Sat, 19 Nov 2022 02:15:34 +0530 Subject: [PATCH 2/9] Add files via upload --- plugins/utilities/share_replay.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/utilities/share_replay.py b/plugins/utilities/share_replay.py index f550fa9..2b43983 100644 --- a/plugins/utilities/share_replay.py +++ b/plugins/utilities/share_replay.py @@ -68,15 +68,17 @@ class Help(PopupWindow): class SyncConfirmation(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale - self.width = 1000#h-hhhhhhhhhhh-----to completeh-hh-hhhhh- + self.width = 600 self.height = 300 PopupWindow.__init__(self, position=(0.0, 0.0), size=(self.width, self.height), scale=1.2,) ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close) - ba.buttonwidget(parent=self.root_widget,label="cancel",size=e) - ba.buttonwidget(parent=self.root_widget,label="continue") + ba.textwidget(parent=self.root_widget, position=(30, self.height * 0.8), + text=" Are you sure you want to continue\n\nWARNING:replays with same name in mods folder\n will be overwritten") + ba.buttonwidget(parent=self.root_widget,label="CANCEL",size=(200,80),color=red,position=(80,50),on_activate_call=self.close) + ba.buttonwidget(parent=self.root_widget,label="continue",size=(200,80),position=(300,50),on_activate_call=SettingWindow.sync) def close(self): ba.playsound(ba.getsound('swish')) @@ -104,12 +106,12 @@ class SettingWindow(): internal=_internal if internal==True: dir_list=listdir(internal_dir) - ba.buttonwidget(edit=self.share_button,label="Export",icon=ba.gettexture("upButton"),) + ba.buttonwidget(edit=self.share_button,label="EXPORT",icon=ba.gettexture("upButton"),) sel=self.internal_tab unsel=self.external_tab else: dir_list=listdir(external_dir) - ba.buttonwidget(edit=self.share_button,label="Import",icon=ba.gettexture("downButton"),) + ba.buttonwidget(edit=self.share_button,label="IMPORT",icon=ba.gettexture("downButton"),) sel= self.external_tab unsel= self.internal_tab @@ -169,7 +171,7 @@ class SettingWindow(): position=internal_tab_pos, size=internal_tab_size, button_type="square", - label="internal", + label="INTERNAL", text_scale=2, color=blue, texture=ba.gettexture("circleShadow")) @@ -179,7 +181,7 @@ class SettingWindow(): position=external_tab_pos, size=external_tab_size, button_type="square", - label="external", + label="EXTERNAL", text_scale=2, color=blue, texture=ba.gettexture("nub")) @@ -208,7 +210,7 @@ class SettingWindow(): label="SYNC", text_scale=2, icon=ba.gettexture("ouyaYButton"), - on_activate_call=self.sync) + on_activate_call=SyncConfirmation) self.close_button = ba.buttonwidget( parent=self.root, @@ -237,7 +239,7 @@ class SettingWindow(): # image={"texture":ba.gettexture("bombColor"),"tint_texture":None,"tint_color":None,"tint2_color":None}) - def sync(self): + def sync(self=""): internal_list=listdir(internal_dir) external_list=listdir(external_dir) for i in internal_list: @@ -250,13 +252,11 @@ class SettingWindow(): Print("Synced all replays",color=pink) def export(self): - copy(internal_dir+self.selected_name, external_dir+self.selected_name) - cprint(internal_dir+self.selected_name) + copy(internal_dir+self.selected_name, external_dir+self.selected_name) Print(self.selected_name[0:-4]+" exported", top=True, color=pink) def importx(self): copy(external_dir+self.selected_name, internal_dir+self.selected_name) - cprint(external_dir+self.selected_name) Print(self.selected_name[0:-4]+" imported", top=True, color=green) def close(self): From 8d11b3433ff0b80f4a1f74e7835f7764d176812e Mon Sep 17 00:00:00 2001 From: Loup <90267658+Loup-Garou911XD@users.noreply.github.com> Date: Sat, 19 Nov 2022 02:18:38 +0530 Subject: [PATCH 3/9] Update utilities.json --- plugins/utilities.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/utilities.json b/plugins/utilities.json index f5dc9fb..ed51f33 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -14,6 +14,7 @@ } ], "versions": { + "1.1.0":null, "1.0.0": { "api_version": 7, "commit_sha": "2fda676", @@ -480,4 +481,4 @@ } } } -} \ No newline at end of file +} From 79a8b525322554e35d997f08eeff4d251f40fec0 Mon Sep 17 00:00:00 2001 From: Loup-Garou911XD Date: Fri, 18 Nov 2022 20:50:28 +0000 Subject: [PATCH 4/9] [ci] auto-format --- plugins/utilities/share_replay.py | 170 ++++++++++++++++-------------- 1 file changed, 88 insertions(+), 82 deletions(-) diff --git a/plugins/utilities/share_replay.py b/plugins/utilities/share_replay.py index 2b43983..34d58a0 100644 --- a/plugins/utilities/share_replay.py +++ b/plugins/utilities/share_replay.py @@ -15,6 +15,7 @@ from bastd.ui.popup import PopupWindow # mod by ʟօʊքɢǟʀօʊ # export replays to mods folder and share with your friends or have a backup + def Print(*args, color=None, top=None): out = "" for arg in args: @@ -22,6 +23,7 @@ def Print(*args, color=None, top=None): out += a ba.screenmessage(out, color=color, top=top) + def cprint(*args): out = "" for arg in args: @@ -29,7 +31,8 @@ def cprint(*args): out += a _ba.chatmessage(out) -title="SHARE REPLAY" + +title = "SHARE REPLAY" internal_dir = path.join("ba_data", "..", "..", "..", "files", "bombsquad_config", "replays" + sep) external_dir = path.join(_ba.env()["python_directory_user"], "replays"+sep) @@ -38,14 +41,13 @@ external_dir = path.join(_ba.env()["python_directory_user"], "replays"+sep) pink = (1, 0.2, 0.8) green = (0.4, 1, 0.4) red = (1, 0, 0) -blue=(0.26, 0.65,0.94) +blue = (0.26, 0.65, 0.94) if not path.exists(external_dir): mkdir(external_dir) Print("You are ready to share replays", color=pink) - class Help(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -64,7 +66,8 @@ class Help(PopupWindow): def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root_widget, transition="out_right",) - + + class SyncConfirmation(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -77,8 +80,10 @@ class SyncConfirmation(PopupWindow): ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close) ba.textwidget(parent=self.root_widget, position=(30, self.height * 0.8), text=" Are you sure you want to continue\n\nWARNING:replays with same name in mods folder\n will be overwritten") - ba.buttonwidget(parent=self.root_widget,label="CANCEL",size=(200,80),color=red,position=(80,50),on_activate_call=self.close) - ba.buttonwidget(parent=self.root_widget,label="continue",size=(200,80),position=(300,50),on_activate_call=SettingWindow.sync) + ba.buttonwidget(parent=self.root_widget, label="CANCEL", size=(200, 80), + color=red, position=(80, 50), on_activate_call=self.close) + ba.buttonwidget(parent=self.root_widget, label="continue", size=(200, 80), + position=(300, 50), on_activate_call=SettingWindow.sync) def close(self): ba.playsound(ba.getsound('swish')) @@ -90,53 +95,53 @@ class SettingWindow(): global internal self.draw_ui() self.selected_name = None - internal=True + internal = True self.on_tab_select(internal) - - def on_select_text(self, widget,name): - existing_widgets=self.scroll2.get_children() + + def on_select_text(self, widget, name): + existing_widgets = self.scroll2.get_children() for i in existing_widgets: - ba.textwidget(edit=i,color=(1,1,1)) + ba.textwidget(edit=i, color=(1, 1, 1)) ba.textwidget(edit=widget, color=(1, 1, 0)) - self.selected_name=name - - - def on_tab_select(self,_internal): - global internal - internal=_internal - if internal==True: - dir_list=listdir(internal_dir) - ba.buttonwidget(edit=self.share_button,label="EXPORT",icon=ba.gettexture("upButton"),) - sel=self.internal_tab - unsel=self.external_tab - else: - dir_list=listdir(external_dir) - ba.buttonwidget(edit=self.share_button,label="IMPORT",icon=ba.gettexture("downButton"),) - sel= self.external_tab - unsel= self.internal_tab - - ba.buttonwidget(edit=sel,texture=ba.gettexture("circleShadow")) - ba.buttonwidget(edit=unsel,texture=ba.gettexture("nub")) - - dir_list=sorted(dir_list) - existing_widgets=self.scroll2.get_children() - if existing_widgets: - for i in existing_widgets: - i.delete() - height = 900 - for i in dir_list: - height -= 40 - a = i - i = ba.textwidget( - parent=self.scroll2, - size=(500, 50), - text=i.split(".")[0], - position=(10, height), - selectable=True, - max_chars=40, - click_activate=True,) - ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i , a)) - + self.selected_name = name + + def on_tab_select(self, _internal): + global internal + internal = _internal + if internal == True: + dir_list = listdir(internal_dir) + ba.buttonwidget(edit=self.share_button, label="EXPORT", icon=ba.gettexture("upButton"),) + sel = self.internal_tab + unsel = self.external_tab + else: + dir_list = listdir(external_dir) + ba.buttonwidget(edit=self.share_button, label="IMPORT", + icon=ba.gettexture("downButton"),) + sel = self.external_tab + unsel = self.internal_tab + + ba.buttonwidget(edit=sel, texture=ba.gettexture("circleShadow")) + ba.buttonwidget(edit=unsel, texture=ba.gettexture("nub")) + + dir_list = sorted(dir_list) + existing_widgets = self.scroll2.get_children() + if existing_widgets: + for i in existing_widgets: + i.delete() + height = 900 + for i in dir_list: + height -= 40 + a = i + i = ba.textwidget( + parent=self.scroll2, + size=(500, 50), + text=i.split(".")[0], + position=(10, height), + selectable=True, + max_chars=40, + click_activate=True,) + ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i, a)) + def draw_ui(self): self.uiscale = ba.app.ui.uiscale self.root = ba.Window(ba.containerwidget( @@ -160,13 +165,13 @@ class SettingWindow(): texture=ba.gettexture("achievementEmpty"), label="", on_activate_call=Help) - - internal_tab_pos=85,400 - internal_tab_size=120,80 - external_tab_pos=85,300 - external_tab_size=120,80 - - self.internal_tab=ba.buttonwidget( + + internal_tab_pos = 85, 400 + internal_tab_size = 120, 80 + external_tab_pos = 85, 300 + external_tab_size = 120, 80 + + self.internal_tab = ba.buttonwidget( parent=self.root, position=internal_tab_pos, size=internal_tab_size, @@ -175,8 +180,8 @@ class SettingWindow(): text_scale=2, color=blue, texture=ba.gettexture("circleShadow")) - - self.external_tab=ba.buttonwidget( + + self.external_tab = ba.buttonwidget( parent=self.root, position=external_tab_pos, size=external_tab_size, @@ -185,12 +190,11 @@ class SettingWindow(): text_scale=2, color=blue, texture=ba.gettexture("nub")) - - ba.buttonwidget(edit=self.internal_tab,on_activate_call=ba.Call(self.on_tab_select,True)) - ba.buttonwidget(edit=self.external_tab,on_activate_call=ba.Call(self.on_tab_select,False)) - - - self.share_button=ba.buttonwidget( + + ba.buttonwidget(edit=self.internal_tab, on_activate_call=ba.Call(self.on_tab_select, True)) + ba.buttonwidget(edit=self.external_tab, on_activate_call=ba.Call(self.on_tab_select, False)) + + self.share_button = ba.buttonwidget( parent=self.root, position=(720, 400), size=(110, 50), @@ -200,8 +204,8 @@ class SettingWindow(): text_scale=2, icon=ba.gettexture("upButton"), on_activate_call=self.share) - - sync_button=ba.buttonwidget( + + sync_button = ba.buttonwidget( parent=self.root, position=(720, 300), size=(110, 50), @@ -228,20 +232,22 @@ class SettingWindow(): size=(500, 400), position=(200, 100),) self.scroll2 = ba.columnwidget(parent=scroll, size=( - 500, 900)) - + 500, 900)) + def share(self): if self.selected_name is None: Print("Select a replay", color=red) return - if internal:self.export() - else:self.importx() - + if internal: + self.export() + else: + self.importx() + # image={"texture":ba.gettexture("bombColor"),"tint_texture":None,"tint_color":None,"tint2_color":None}) - + def sync(self=""): - internal_list=listdir(internal_dir) - external_list=listdir(external_dir) + internal_list = listdir(internal_dir) + external_list = listdir(external_dir) for i in internal_list: copy(internal_dir+sep+i, external_dir+sep+i) for i in external_list: @@ -249,16 +255,16 @@ class SettingWindow(): pass else: copy(external_dir+sep+i, internal_dir+sep+i) - Print("Synced all replays",color=pink) - + Print("Synced all replays", color=pink) + def export(self): - copy(internal_dir+self.selected_name, external_dir+self.selected_name) + copy(internal_dir+self.selected_name, external_dir+self.selected_name) Print(self.selected_name[0:-4]+" exported", top=True, color=pink) - + def importx(self): copy(external_dir+self.selected_name, internal_dir+self.selected_name) - Print(self.selected_name[0:-4]+" imported", top=True, color=green) - + Print(self.selected_name[0:-4]+" imported", top=True, color=green) + def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root, transition="out_right",) @@ -298,6 +304,6 @@ class Loup(ba.Plugin): def show_settings_ui(self, button): SettingWindow() - + def on_plugin_manager_prompt(self): SettingWindow() From 78c4b223897f206fab07e1d6d884143420ba4a24 Mon Sep 17 00:00:00 2001 From: Loup-Garou911XD Date: Fri, 18 Nov 2022 20:50:30 +0000 Subject: [PATCH 5/9] [ci] apply-version-metadata --- plugins/utilities.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/utilities.json b/plugins/utilities.json index ed51f33..9e00836 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -14,7 +14,12 @@ } ], "versions": { - "1.1.0":null, + "1.1.0": { + "api_version": 7, + "commit_sha": "79a8b52", + "released_on": "18-11-2022", + "md5sum": "a68184081983346d3eb51c9c85b73796" + }, "1.0.0": { "api_version": 7, "commit_sha": "2fda676", @@ -481,4 +486,4 @@ } } } -} +} \ No newline at end of file From bc15767e5dc0282373a960b6f104ca299f262a38 Mon Sep 17 00:00:00 2001 From: Loup <90267658+Loup-Garou911XD@users.noreply.github.com> Date: Sat, 19 Nov 2022 08:44:56 +0530 Subject: [PATCH 6/9] UI improvements --- plugins/utilities/share_replay.py | 215 +++++++++++++++--------------- 1 file changed, 107 insertions(+), 108 deletions(-) diff --git a/plugins/utilities/share_replay.py b/plugins/utilities/share_replay.py index 34d58a0..b63b1b0 100644 --- a/plugins/utilities/share_replay.py +++ b/plugins/utilities/share_replay.py @@ -15,7 +15,6 @@ from bastd.ui.popup import PopupWindow # mod by ʟօʊքɢǟʀօʊ # export replays to mods folder and share with your friends or have a backup - def Print(*args, color=None, top=None): out = "" for arg in args: @@ -23,7 +22,6 @@ def Print(*args, color=None, top=None): out += a ba.screenmessage(out, color=color, top=top) - def cprint(*args): out = "" for arg in args: @@ -31,23 +29,26 @@ def cprint(*args): out += a _ba.chatmessage(out) - -title = "SHARE REPLAY" +title="SHARE REPLAY" internal_dir = path.join("ba_data", "..", "..", "..", "files", "bombsquad_config", "replays" + sep) external_dir = path.join(_ba.env()["python_directory_user"], "replays"+sep) +tab_sel_texture=ba.gettexture("buttonSquare") +tab_unsel_texture=ba.gettexture("chestIconEmpty") # colors pink = (1, 0.2, 0.8) green = (0.4, 1, 0.4) red = (1, 0, 0) -blue = (0.26, 0.65, 0.94) +blue=(0.26, 0.65,0.94) +blue_highlight= (0.4, 0.7,1) if not path.exists(external_dir): mkdir(external_dir) Print("You are ready to share replays", color=pink) + class Help(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -66,8 +67,7 @@ class Help(PopupWindow): def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root_widget, transition="out_right",) - - + class SyncConfirmation(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -77,13 +77,14 @@ class SyncConfirmation(PopupWindow): position=(0.0, 0.0), size=(self.width, self.height), scale=1.2,) - ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close) + ba.textwidget(parent=self.root_widget, position=(30, self.height * 0.8), text=" Are you sure you want to continue\n\nWARNING:replays with same name in mods folder\n will be overwritten") - ba.buttonwidget(parent=self.root_widget, label="CANCEL", size=(200, 80), - color=red, position=(80, 50), on_activate_call=self.close) - ba.buttonwidget(parent=self.root_widget, label="continue", size=(200, 80), - position=(300, 50), on_activate_call=SettingWindow.sync) + cancel=ba.buttonwidget(parent=self.root_widget,label=ba.Lstr(resource='cancelText'),size=(200,80),position=(80,50),on_activate_call=self.close) + + ba.buttonwidget(parent=self.root_widget,label=ba.Lstr(resource='okText'),size=(200,80),position=(300,50),color=green,on_activate_call=SettingWindow.sync) + + ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close,cancel_button=cancel) def close(self): ba.playsound(ba.getsound('swish')) @@ -94,63 +95,73 @@ class SettingWindow(): def __init__(self): global internal self.draw_ui() + ba.containerwidget(edit=self.root,cancel_button=self.close_button) self.selected_name = None - internal = True + internal=True self.on_tab_select(internal) - - def on_select_text(self, widget, name): - existing_widgets = self.scroll2.get_children() + + def on_select_text(self, widget,name): + existing_widgets=self.scroll2.get_children() for i in existing_widgets: - ba.textwidget(edit=i, color=(1, 1, 1)) + ba.textwidget(edit=i,color=(1,1,1)) ba.textwidget(edit=widget, color=(1, 1, 0)) - self.selected_name = name - - def on_tab_select(self, _internal): - global internal - internal = _internal - if internal == True: - dir_list = listdir(internal_dir) - ba.buttonwidget(edit=self.share_button, label="EXPORT", icon=ba.gettexture("upButton"),) - sel = self.internal_tab - unsel = self.external_tab - else: - dir_list = listdir(external_dir) - ba.buttonwidget(edit=self.share_button, label="IMPORT", - icon=ba.gettexture("downButton"),) - sel = self.external_tab - unsel = self.internal_tab - - ba.buttonwidget(edit=sel, texture=ba.gettexture("circleShadow")) - ba.buttonwidget(edit=unsel, texture=ba.gettexture("nub")) - - dir_list = sorted(dir_list) - existing_widgets = self.scroll2.get_children() - if existing_widgets: - for i in existing_widgets: - i.delete() - height = 900 - for i in dir_list: - height -= 40 - a = i - i = ba.textwidget( - parent=self.scroll2, - size=(500, 50), - text=i.split(".")[0], - position=(10, height), - selectable=True, - max_chars=40, - click_activate=True,) - ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i, a)) - + self.selected_name=name + + + def on_tab_select(self,_internal): + global internal + internal=_internal + if internal==True: + dir_list=listdir(internal_dir) + ba.buttonwidget(edit=self.share_button,label="EXPORT",icon=ba.gettexture("upButton"),) + sel=self.internal_tab + unsel=self.external_tab + else: + dir_list=listdir(external_dir) + ba.buttonwidget(edit=self.share_button,label="IMPORT",icon=ba.gettexture("downButton"),) + sel= self.external_tab + unsel= self.internal_tab + + ba.buttonwidget(edit=sel,texture=tab_sel_texture,color=blue,size=(120,80)) + ba.buttonwidget(edit=unsel,texture=tab_unsel_texture,color=blue,size=(120,100)) + + dir_list=sorted(dir_list) + existing_widgets=self.scroll2.get_children() + if existing_widgets: + for i in existing_widgets: + i.delete() + height = 900 + for i in dir_list: + height -= 40 + a = i + i = ba.textwidget( + parent=self.scroll2, + size=(500, 50), + text=i.split(".")[0], + position=(10, height), + selectable=True, + max_chars=40, + click_activate=True,) + ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i , a)) + def draw_ui(self): self.uiscale = ba.app.ui.uiscale self.root = ba.Window(ba.containerwidget( size=(900, 670), on_outside_click_call=self.close, transition="in_right")).get_root_widget() - + + self.close_button = ba.buttonwidget( + parent=self.root, + position=(90, 560), + button_type='backSmall', + size=(60, 60), + label=ba.charstr(ba.SpecialChar.BACK), + scale=1.5, + on_activate_call=self.close) + ba.textwidget( parent=self.root, size=(200, 100), - position=(150, 550), + position=(350, 550), scale=2, selectable=False, h_align="center", @@ -160,28 +171,28 @@ class SettingWindow(): ba.buttonwidget( parent=self.root, - position=(450, 580), + position=(650, 580), size=(35, 35), texture=ba.gettexture("achievementEmpty"), label="", on_activate_call=Help) - - internal_tab_pos = 85, 400 - internal_tab_size = 120, 80 - external_tab_pos = 85, 300 - external_tab_size = 120, 80 - - self.internal_tab = ba.buttonwidget( + + internal_tab_pos=85,400 + internal_tab_size=120,80 + external_tab_pos=85,300 + external_tab_size=120,80 + + self.internal_tab=ba.buttonwidget( parent=self.root, position=internal_tab_pos, size=internal_tab_size, button_type="square", label="INTERNAL", text_scale=2, - color=blue, - texture=ba.gettexture("circleShadow")) - - self.external_tab = ba.buttonwidget( + color=blue_highlight, + texture=tab_sel_texture) + + self.external_tab=ba.buttonwidget( parent=self.root, position=external_tab_pos, size=external_tab_size, @@ -189,12 +200,13 @@ class SettingWindow(): label="EXTERNAL", text_scale=2, color=blue, - texture=ba.gettexture("nub")) - - ba.buttonwidget(edit=self.internal_tab, on_activate_call=ba.Call(self.on_tab_select, True)) - ba.buttonwidget(edit=self.external_tab, on_activate_call=ba.Call(self.on_tab_select, False)) - - self.share_button = ba.buttonwidget( + texture=tab_unsel_texture) + + ba.buttonwidget(edit=self.internal_tab,on_activate_call=ba.Call(self.on_tab_select,True)) + ba.buttonwidget(edit=self.external_tab,on_activate_call=ba.Call(self.on_tab_select,False)) + + + self.share_button=ba.buttonwidget( parent=self.root, position=(720, 400), size=(110, 50), @@ -204,8 +216,8 @@ class SettingWindow(): text_scale=2, icon=ba.gettexture("upButton"), on_activate_call=self.share) - - sync_button = ba.buttonwidget( + + sync_button=ba.buttonwidget( parent=self.root, position=(720, 300), size=(110, 50), @@ -214,40 +226,27 @@ class SettingWindow(): label="SYNC", text_scale=2, icon=ba.gettexture("ouyaYButton"), - on_activate_call=SyncConfirmation) - - self.close_button = ba.buttonwidget( - parent=self.root, - position=(800, 590), - size=(35, 35), - texture=ba.gettexture("crossOut"), - label="", - scale=2, - color=(1, 0.2, 0.2), - extra_touch_border_scale=3, - on_activate_call=self.close) + on_activate_call=SyncConfirmation) scroll = ba.scrollwidget( parent=self.root, size=(500, 400), position=(200, 100),) self.scroll2 = ba.columnwidget(parent=scroll, size=( - 500, 900)) - + 500, 900)) + def share(self): if self.selected_name is None: Print("Select a replay", color=red) return - if internal: - self.export() - else: - self.importx() - + if internal:self.export() + else:self.importx() + # image={"texture":ba.gettexture("bombColor"),"tint_texture":None,"tint_color":None,"tint2_color":None}) - + def sync(self=""): - internal_list = listdir(internal_dir) - external_list = listdir(external_dir) + internal_list=listdir(internal_dir) + external_list=listdir(external_dir) for i in internal_list: copy(internal_dir+sep+i, external_dir+sep+i) for i in external_list: @@ -255,21 +254,21 @@ class SettingWindow(): pass else: copy(external_dir+sep+i, internal_dir+sep+i) - Print("Synced all replays", color=pink) - + Print("Synced all replays",color=pink) + def export(self): - copy(internal_dir+self.selected_name, external_dir+self.selected_name) + copy(internal_dir+self.selected_name, external_dir+self.selected_name) Print(self.selected_name[0:-4]+" exported", top=True, color=pink) - + def importx(self): copy(external_dir+self.selected_name, internal_dir+self.selected_name) - Print(self.selected_name[0:-4]+" imported", top=True, color=green) - + Print(self.selected_name[0:-4]+" imported", top=True, color=green) + def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root, transition="out_right",) - + # ++++++++++++++++for keyboard navigation++++++++++++++++ #ba.widget(edit=self.enable_button, up_widget=decrease_button, down_widget=self.lower_text,left_widget=save_button, right_widget=save_button) @@ -304,6 +303,6 @@ class Loup(ba.Plugin): def show_settings_ui(self, button): SettingWindow() - + def on_plugin_manager_prompt(self): SettingWindow() From 95bc8cc9f0c7a2ccf723e778ff4c949e71f65529 Mon Sep 17 00:00:00 2001 From: Loup-Garou911XD Date: Sat, 19 Nov 2022 03:15:25 +0000 Subject: [PATCH 7/9] [ci] auto-format --- plugins/utilities/share_replay.py | 197 ++++++++++++++++-------------- 1 file changed, 102 insertions(+), 95 deletions(-) diff --git a/plugins/utilities/share_replay.py b/plugins/utilities/share_replay.py index b63b1b0..203a4cc 100644 --- a/plugins/utilities/share_replay.py +++ b/plugins/utilities/share_replay.py @@ -15,6 +15,7 @@ from bastd.ui.popup import PopupWindow # mod by ʟօʊքɢǟʀօʊ # export replays to mods folder and share with your friends or have a backup + def Print(*args, color=None, top=None): out = "" for arg in args: @@ -22,6 +23,7 @@ def Print(*args, color=None, top=None): out += a ba.screenmessage(out, color=color, top=top) + def cprint(*args): out = "" for arg in args: @@ -29,26 +31,26 @@ def cprint(*args): out += a _ba.chatmessage(out) -title="SHARE REPLAY" + +title = "SHARE REPLAY" internal_dir = path.join("ba_data", "..", "..", "..", "files", "bombsquad_config", "replays" + sep) external_dir = path.join(_ba.env()["python_directory_user"], "replays"+sep) -tab_sel_texture=ba.gettexture("buttonSquare") -tab_unsel_texture=ba.gettexture("chestIconEmpty") +tab_sel_texture = ba.gettexture("buttonSquare") +tab_unsel_texture = ba.gettexture("chestIconEmpty") # colors pink = (1, 0.2, 0.8) green = (0.4, 1, 0.4) red = (1, 0, 0) -blue=(0.26, 0.65,0.94) -blue_highlight= (0.4, 0.7,1) +blue = (0.26, 0.65, 0.94) +blue_highlight = (0.4, 0.7, 1) if not path.exists(external_dir): mkdir(external_dir) Print("You are ready to share replays", color=pink) - class Help(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -67,7 +69,8 @@ class Help(PopupWindow): def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root_widget, transition="out_right",) - + + class SyncConfirmation(PopupWindow): def __init__(self): uiscale = ba.app.ui.uiscale @@ -77,14 +80,17 @@ class SyncConfirmation(PopupWindow): position=(0.0, 0.0), size=(self.width, self.height), scale=1.2,) - + ba.textwidget(parent=self.root_widget, position=(30, self.height * 0.8), text=" Are you sure you want to continue\n\nWARNING:replays with same name in mods folder\n will be overwritten") - cancel=ba.buttonwidget(parent=self.root_widget,label=ba.Lstr(resource='cancelText'),size=(200,80),position=(80,50),on_activate_call=self.close) - - ba.buttonwidget(parent=self.root_widget,label=ba.Lstr(resource='okText'),size=(200,80),position=(300,50),color=green,on_activate_call=SettingWindow.sync) - - ba.containerwidget(edit=self.root_widget, on_outside_click_call=self.close,cancel_button=cancel) + cancel = ba.buttonwidget(parent=self.root_widget, label=ba.Lstr( + resource='cancelText'), size=(200, 80), position=(80, 50), on_activate_call=self.close) + + ba.buttonwidget(parent=self.root_widget, label=ba.Lstr(resource='okText'), size=( + 200, 80), position=(300, 50), color=green, on_activate_call=SettingWindow.sync) + + ba.containerwidget(edit=self.root_widget, + on_outside_click_call=self.close, cancel_button=cancel) def close(self): ba.playsound(ba.getsound('swish')) @@ -95,69 +101,69 @@ class SettingWindow(): def __init__(self): global internal self.draw_ui() - ba.containerwidget(edit=self.root,cancel_button=self.close_button) + ba.containerwidget(edit=self.root, cancel_button=self.close_button) self.selected_name = None - internal=True + internal = True self.on_tab_select(internal) - - def on_select_text(self, widget,name): - existing_widgets=self.scroll2.get_children() + + def on_select_text(self, widget, name): + existing_widgets = self.scroll2.get_children() for i in existing_widgets: - ba.textwidget(edit=i,color=(1,1,1)) + ba.textwidget(edit=i, color=(1, 1, 1)) ba.textwidget(edit=widget, color=(1, 1, 0)) - self.selected_name=name - - - def on_tab_select(self,_internal): - global internal - internal=_internal - if internal==True: - dir_list=listdir(internal_dir) - ba.buttonwidget(edit=self.share_button,label="EXPORT",icon=ba.gettexture("upButton"),) - sel=self.internal_tab - unsel=self.external_tab - else: - dir_list=listdir(external_dir) - ba.buttonwidget(edit=self.share_button,label="IMPORT",icon=ba.gettexture("downButton"),) - sel= self.external_tab - unsel= self.internal_tab - - ba.buttonwidget(edit=sel,texture=tab_sel_texture,color=blue,size=(120,80)) - ba.buttonwidget(edit=unsel,texture=tab_unsel_texture,color=blue,size=(120,100)) - - dir_list=sorted(dir_list) - existing_widgets=self.scroll2.get_children() - if existing_widgets: - for i in existing_widgets: - i.delete() - height = 900 - for i in dir_list: - height -= 40 - a = i - i = ba.textwidget( - parent=self.scroll2, - size=(500, 50), - text=i.split(".")[0], - position=(10, height), - selectable=True, - max_chars=40, - click_activate=True,) - ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i , a)) - + self.selected_name = name + + def on_tab_select(self, _internal): + global internal + internal = _internal + if internal == True: + dir_list = listdir(internal_dir) + ba.buttonwidget(edit=self.share_button, label="EXPORT", icon=ba.gettexture("upButton"),) + sel = self.internal_tab + unsel = self.external_tab + else: + dir_list = listdir(external_dir) + ba.buttonwidget(edit=self.share_button, label="IMPORT", + icon=ba.gettexture("downButton"),) + sel = self.external_tab + unsel = self.internal_tab + + ba.buttonwidget(edit=sel, texture=tab_sel_texture, color=blue, size=(120, 80)) + ba.buttonwidget(edit=unsel, texture=tab_unsel_texture, color=blue, size=(120, 100)) + + dir_list = sorted(dir_list) + existing_widgets = self.scroll2.get_children() + if existing_widgets: + for i in existing_widgets: + i.delete() + height = 900 + for i in dir_list: + height -= 40 + a = i + i = ba.textwidget( + parent=self.scroll2, + size=(500, 50), + text=i.split(".")[0], + position=(10, height), + selectable=True, + max_chars=40, + click_activate=True,) + ba.textwidget(edit=i, on_activate_call=ba.Call(self.on_select_text, i, a)) + def draw_ui(self): self.uiscale = ba.app.ui.uiscale self.root = ba.Window(ba.containerwidget( size=(900, 670), on_outside_click_call=self.close, transition="in_right")).get_root_widget() - + self.close_button = ba.buttonwidget( parent=self.root, position=(90, 560), button_type='backSmall', size=(60, 60), - label=ba.charstr(ba.SpecialChar.BACK), + label=ba.charstr(ba.SpecialChar.BACK), scale=1.5, on_activate_call=self.close) - + ba.textwidget( parent=self.root, size=(200, 100), @@ -176,13 +182,13 @@ class SettingWindow(): texture=ba.gettexture("achievementEmpty"), label="", on_activate_call=Help) - - internal_tab_pos=85,400 - internal_tab_size=120,80 - external_tab_pos=85,300 - external_tab_size=120,80 - - self.internal_tab=ba.buttonwidget( + + internal_tab_pos = 85, 400 + internal_tab_size = 120, 80 + external_tab_pos = 85, 300 + external_tab_size = 120, 80 + + self.internal_tab = ba.buttonwidget( parent=self.root, position=internal_tab_pos, size=internal_tab_size, @@ -191,8 +197,8 @@ class SettingWindow(): text_scale=2, color=blue_highlight, texture=tab_sel_texture) - - self.external_tab=ba.buttonwidget( + + self.external_tab = ba.buttonwidget( parent=self.root, position=external_tab_pos, size=external_tab_size, @@ -201,12 +207,11 @@ class SettingWindow(): text_scale=2, color=blue, texture=tab_unsel_texture) - - ba.buttonwidget(edit=self.internal_tab,on_activate_call=ba.Call(self.on_tab_select,True)) - ba.buttonwidget(edit=self.external_tab,on_activate_call=ba.Call(self.on_tab_select,False)) - - - self.share_button=ba.buttonwidget( + + ba.buttonwidget(edit=self.internal_tab, on_activate_call=ba.Call(self.on_tab_select, True)) + ba.buttonwidget(edit=self.external_tab, on_activate_call=ba.Call(self.on_tab_select, False)) + + self.share_button = ba.buttonwidget( parent=self.root, position=(720, 400), size=(110, 50), @@ -216,8 +221,8 @@ class SettingWindow(): text_scale=2, icon=ba.gettexture("upButton"), on_activate_call=self.share) - - sync_button=ba.buttonwidget( + + sync_button = ba.buttonwidget( parent=self.root, position=(720, 300), size=(110, 50), @@ -226,27 +231,29 @@ class SettingWindow(): label="SYNC", text_scale=2, icon=ba.gettexture("ouyaYButton"), - on_activate_call=SyncConfirmation) + on_activate_call=SyncConfirmation) scroll = ba.scrollwidget( parent=self.root, size=(500, 400), position=(200, 100),) self.scroll2 = ba.columnwidget(parent=scroll, size=( - 500, 900)) - + 500, 900)) + def share(self): if self.selected_name is None: Print("Select a replay", color=red) return - if internal:self.export() - else:self.importx() - + if internal: + self.export() + else: + self.importx() + # image={"texture":ba.gettexture("bombColor"),"tint_texture":None,"tint_color":None,"tint2_color":None}) - + def sync(self=""): - internal_list=listdir(internal_dir) - external_list=listdir(external_dir) + internal_list = listdir(internal_dir) + external_list = listdir(external_dir) for i in internal_list: copy(internal_dir+sep+i, external_dir+sep+i) for i in external_list: @@ -254,21 +261,21 @@ class SettingWindow(): pass else: copy(external_dir+sep+i, internal_dir+sep+i) - Print("Synced all replays",color=pink) - + Print("Synced all replays", color=pink) + def export(self): - copy(internal_dir+self.selected_name, external_dir+self.selected_name) + copy(internal_dir+self.selected_name, external_dir+self.selected_name) Print(self.selected_name[0:-4]+" exported", top=True, color=pink) - + def importx(self): copy(external_dir+self.selected_name, internal_dir+self.selected_name) - Print(self.selected_name[0:-4]+" imported", top=True, color=green) - + Print(self.selected_name[0:-4]+" imported", top=True, color=green) + def close(self): ba.playsound(ba.getsound('swish')) ba.containerwidget(edit=self.root, transition="out_right",) - + # ++++++++++++++++for keyboard navigation++++++++++++++++ #ba.widget(edit=self.enable_button, up_widget=decrease_button, down_widget=self.lower_text,left_widget=save_button, right_widget=save_button) @@ -303,6 +310,6 @@ class Loup(ba.Plugin): def show_settings_ui(self, button): SettingWindow() - + def on_plugin_manager_prompt(self): SettingWindow() From 77f92a5cb2e6f20e66a154f144ee0dc203ac0441 Mon Sep 17 00:00:00 2001 From: Loup <90267658+Loup-Garou911XD@users.noreply.github.com> Date: Sat, 19 Nov 2022 08:49:52 +0530 Subject: [PATCH 8/9] Remove v1.1.0 meta --- plugins/utilities.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/utilities.json b/plugins/utilities.json index 9e00836..2ce7604 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -14,12 +14,7 @@ } ], "versions": { - "1.1.0": { - "api_version": 7, - "commit_sha": "79a8b52", - "released_on": "18-11-2022", - "md5sum": "a68184081983346d3eb51c9c85b73796" - }, + "1.1.0": null, "1.0.0": { "api_version": 7, "commit_sha": "2fda676", @@ -486,4 +481,4 @@ } } } -} \ No newline at end of file +} From c382fdb3390221f9f4445959b52e0e9670a44bfb Mon Sep 17 00:00:00 2001 From: Loup-Garou911XD Date: Sat, 19 Nov 2022 03:20:19 +0000 Subject: [PATCH 9/9] [ci] apply-version-metadata --- plugins/utilities.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/utilities.json b/plugins/utilities.json index 2ce7604..c62857b 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -14,7 +14,12 @@ } ], "versions": { - "1.1.0": null, + "1.1.0": { + "api_version": 7, + "commit_sha": "77f92a5", + "released_on": "19-11-2022", + "md5sum": "07eaf53c99b938e08383d09f1cdd01ab" + }, "1.0.0": { "api_version": 7, "commit_sha": "2fda676", @@ -481,4 +486,4 @@ } } } -} +} \ No newline at end of file