From 6ec69dc892fd260c128808b64efc57e5a7f1641f Mon Sep 17 00:00:00 2001 From: Felix Pankratz Date: Wed, 30 Aug 2023 19:46:30 +0200 Subject: [PATCH] move to dict instead of list for loadedstories --- hn.py | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/hn.py b/hn.py index c4a6a48..9c151eb 100755 --- a/hn.py +++ b/hn.py @@ -22,7 +22,7 @@ class Client: self.screen.keypad(True) self.topstories = api.get_topstories() - self.loadedstories = [] + self.loadedstories = {} self.story_pos = 0 self.cursor_pos = 0 @@ -34,7 +34,15 @@ class Client: for idx, i in enumerate(self.topstories[from_pos:to_pos]): self.set_footer(f'[{spinner_states[idx%4]}] Loading { to_pos - from_pos } stories...') self.screen.refresh() - self.loadedstories.append(api.get_story(i)) + if i in self.loadedstories.keys(): + # upon reloading, refresh counts + title + updated_story = api.get_story(i) + self.loadedstories[i].votes = updated_story.votes + self.loadedstories[i].comments = updated_story.comments + self.loadedstories[i].title = updated_story.title + pass + else: + self.loadedstories[i] = api.get_story(i) def set_footer(self, footer): self.screen.addstr(curses.LINES - 1, 0, footer, curses.A_REVERSE) @@ -52,7 +60,8 @@ class Client: self.screen.addstr(title_string, curses.color_pair(1)) - for i, story in enumerate(self.loadedstories[self.story_pos:self.story_pos + self.stories_in_a_site]): + for i, story_id in enumerate(self.topstories[self.story_pos:self.story_pos + self.stories_in_a_site]): + story = self.loadedstories[story_id] prefix = '>' if i == self.cursor_pos else '' # calculate length of line text = f'{prefix} ()\n' @@ -81,11 +90,12 @@ class Client: self.screen.addstr(f' ({link})\n', curses.A_DIM ) page = int(self.story_pos / self.stories_in_a_site + 1) - total_pages = math.ceil(len(self.loadedstories)/self.stories_in_a_site) + total_pages = math.ceil(len(self.loadedstories)/500) self.set_footer(f'Page {page}/{total_pages}, loaded {len(self.loadedstories)} stories.') def handle_input(self): c = self.screen.getch() + story = self.loadedstories[self.topstories[self.story_pos + self.cursor_pos]] if c == ord('q'): # Quit self.exit() elif c == curses.KEY_UP: @@ -105,13 +115,16 @@ class Client: self.load_more_if_needed() elif c == ord('c'): - webbrowser.open(f'https://news.ycombinator.com/item?id={self.loadedstories[self.story_pos + self.cursor_pos].id}') + # open comments + webbrowser.open(f'https://news.ycombinator.com/item?id={story.id}') + elif c == curses.KEY_ENTER or c == 10: - if self.loadedstories[self.story_pos + self.cursor_pos].link == 'No URL': - webbrowser.open(f'https://news.ycombinator.com/item?id={self.loadedstories[self.story_pos + self.cursor_pos].id}') + # open link + if story.link == 'No URL': + webbrowser.open(f'https://news.ycombinator.com/item?id={story.id}') else: - webbrowser.open(self.loadedstories[self.story_pos + self.cursor_pos].link) - self.loadedstories[self.story_pos + self.cursor_pos].read = True + webbrowser.open(story.link) + story.read = True elif c == ord('r'): self.reload() elif c == curses.KEY_RESIZE: @@ -121,9 +134,9 @@ class Client: self.load_more_if_needed() def load_more_if_needed(self): - if len(self.loadedstories) < self.story_pos + self.stories_in_a_site: + # if len(self.loadedstories) < self.story_pos + self.stories_in_a_site: # load more - self.load_stories(len(self.loadedstories), self.story_pos + self.stories_in_a_site) + self.load_stories(self.story_pos, self.story_pos + self.stories_in_a_site) def run(self): self.load_stories(0, self.stories_in_a_site) @@ -137,8 +150,10 @@ class Client: sys.exit(0) def reload(self): + self.set_footer("Reloading...") + self.screen.refresh() self.topstories = api.get_topstories() - self.loadedstories = [] + #self.loadedstories = [] self.story_pos = 0 self.cursor_pos = 0 self.load_more_if_needed()