def _refresh_my_replays(self) -> None: assert self._columnwidget is not None for child in self._columnwidget.get_children(): child.delete() t_scale = 1.6 try: names = os.listdir(_ba.get_replays_dir()) # ignore random other files in there.. names = [n for n in names if n.endswith('.brp')] names.sort(key=lambda x: x.lower()) except Exception: ba.print_exception('Error listing replays dir.') names = [] assert self._my_replays_scroll_width is not None assert self._my_replays_watch_replay_button is not None for i, name in enumerate(names): txt = ba.textwidget( parent=self._columnwidget, size=(self._my_replays_scroll_width / t_scale, 30), selectable=True, color=(1.0, 1, 0.4) if name == '__lastReplay.brp' else (1, 1, 1), always_highlight=True, on_select_call=ba.Call(self._on_my_replay_select, name), on_activate_call=self._my_replays_watch_replay_button.activate, text=self._get_replay_display_name(name), h_align='left', v_align='center', corner_scale=t_scale, maxwidth=(self._my_replays_scroll_width / t_scale) * 0.93) if i == 0: ba.widget(edit=txt, up_widget=self._tab_buttons['my_replays'])
def _export_my_replay(self) -> None: if self._my_replay_selected is None: self._no_replay_selected_error() return replay = self._my_replay_selected user_dir = _ba.app.python_directory_user try: if replay != '__lastReplay.brp': export_dir = (user_dir + '/replays') if not os.path.exists(export_dir): os.mkdir(export_dir) old_name_full = (_ba.get_replays_dir() + '/' + replay) new_name_full = (export_dir + '/' + replay) if os.path.exists(new_name_full): ba.playsound(ba.getsound('error')) ba.screenmessage((f"A replay with '{replay[:-4]}' name " 'already exists in folder'), color=(1, 0, 0)) else: copyfile(old_name_full, new_name_full) self._refresh_my_replays() ba.playsound(ba.getsound('gunCocking')) ba.screenmessage(f"Successfully Exported '{replay[:-4]}'", color=(0, 1, 0)) else: ba.playsound(ba.getsound('error')) ba.screenmessage( "Cannot Export 'Last Game Replay'. Please rename it", color=(1, 0, 0)) except Exception as _: ba.screenmessage(f'{_}', color=(1, 0, 0)) ba.playsound(ba.getsound('error'))
def _import_my_replay(self, replay_path: str = None) -> None: try: # Handling corner-case if user presses # cancel button in the file selector if not isinstance(replay_path, str): return old_name_full = replay_path i = replay_path.rfind('/') replay_name = (replay_path[i + 1:-4] + '.brp') new_name_full = (_ba.get_replays_dir() + '/' + replay_name) if os.path.exists(new_name_full): ba.playsound(ba.getsound('error')) ba.screenmessage( f"A replay with '{replay_name[:-4]}' name already exists", color=(1, 0, 0)) else: copyfile(old_name_full, new_name_full) self._refresh_my_replays() ba.playsound(ba.getsound('gunCocking')) ba.screenmessage(f"Successfully Imported '{replay_name[:-4]}'", color=(0, 1, 0)) except Exception as _: ba.screenmessage(f'{_}', color=(1, 0, 0)) ba.playsound(ba.getsound('error')) return
def _rename_my_replay(self, replay: str) -> None: new_name = None try: if not self._my_replay_rename_text: return new_name_raw = cast( str, ba.textwidget(query=self._my_replay_rename_text)) new_name = new_name_raw + '.brp' # Ignore attempts to change it to what it already is # (or what it looks like to the user). if (replay != new_name and self._get_replay_display_name(replay) != new_name_raw): old_name_full = (_ba.get_replays_dir() + '/' + replay).encode('utf-8') new_name_full = (_ba.get_replays_dir() + '/' + new_name).encode('utf-8') # False alarm; ba.textwidget can return non-None val. # pylint: disable=unsupported-membership-test if os.path.exists(new_name_full): ba.playsound(ba.getsound('error')) ba.screenmessage( ba.Lstr(resource=self._r + '.replayRenameErrorAlreadyExistsText'), color=(1, 0, 0)) elif any(char in new_name_raw for char in ['/', '\\', ':']): ba.playsound(ba.getsound('error')) ba.screenmessage(ba.Lstr(resource=self._r + '.replayRenameErrorInvalidName'), color=(1, 0, 0)) else: _ba.increment_analytics_count('Replay rename') os.rename(old_name_full, new_name_full) self._refresh_my_replays() ba.playsound(ba.getsound('gunCocking')) except Exception: ba.print_exception( f"Error renaming replay '{replay}' to '{new_name}'.") ba.playsound(ba.getsound('error')) ba.screenmessage( ba.Lstr(resource=self._r + '.replayRenameErrorText'), color=(1, 0, 0), ) ba.containerwidget(edit=self._my_replays_rename_window, transition='out_scale')
def _delete_replay(self, replay: str) -> None: try: _ba.increment_analytics_count('Replay delete') os.remove((_ba.get_replays_dir() + '/' + replay).encode('utf-8')) self._refresh_my_replays() ba.playsound(ba.getsound('shieldDown')) if replay == self._my_replay_selected: self._my_replay_selected = None except Exception: ba.print_exception("exception deleting replay '" + replay + "'") ba.playsound(ba.getsound('error')) ba.screenmessage(ba.Lstr(resource=self._r + '.replayDeleteErrorText'), color=(1, 0, 0))
def do_it() -> None: try: # reset to normal speed _ba.set_replay_speed_exponent(0) _ba.fade_screen(True) assert self._my_replay_selected is not None _ba.new_replay_session(_ba.get_replays_dir() + '/' + self._my_replay_selected) except Exception: ba.print_exception('exception running replay session') # drop back into a fresh main menu session # in case we half-launched or something.. from bastd import mainmenu _ba.new_host_session(mainmenu.MainMenuSession)
def get_upload_path() -> str: from _ba import get_replays_dir return get_replays_dir()
def get_upload_path() -> str: return get_replays_dir()