From 8c56211d947863a858d3e2573a9a9a5a965f9ffd Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Wed, 1 Apr 2015 18:58:06 -0500 Subject: [PATCH 1/6] login with '+' key --- rtv/docs.py | 1 + rtv/page.py | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/rtv/docs.py b/rtv/docs.py index 025a9e6..f6b0e3c 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -31,6 +31,7 @@ Global Commands `r` : Refresh the current page `q` : Quit the program `ENTER` or `o` : Open the selected item in the default web browser + `+` : Log in `?` : Show this help message Subreddit Mode diff --git a/rtv/page.py b/rtv/page.py index 4a30465..43f26c3 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -226,17 +226,43 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) - def prompt_input(self, prompt): + @BaseController.register('+') + def login(self): + username = self.prompt_input('Enter username: ') + password = self.prompt_input('Enter password: ', hide=True) + + if (username == '') or (password == ''): + curses.flash() + return + try: + self.reddit.login(username, password) + + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, + ['Invalid password for username: {}'.format(username)]) + else: + show_notification(self.stdscr, + ['Successfully logged in as: {}'.format(username)]) + + return + + def prompt_input(self, prompt, hide=False): """Prompt the user for input""" attr = curses.A_BOLD | Color.CYAN n_rows, n_cols = self.stdscr.getmaxyx() - self.stdscr.addstr(n_rows - 1, 0, prompt, attr) - self.stdscr.refresh() - window = self.stdscr.derwin(1, n_cols - len(prompt), - n_rows - 1, len(prompt)) - window.attrset(attr) - out = text_input(window) + if hide: + self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_rows-1-len(prompt)), attr) + out = self.stdscr.getstr(n_rows-1, 1) + else: + self.stdscr.addstr(n_rows - 1, 0, prompt, attr) + self.stdscr.refresh() + window = self.stdscr.derwin(1, n_cols - len(prompt), + n_rows - 1, len(prompt)) + window.attrset(attr) + + out = text_input(window) + return out def draw(self): From 59b657de37a26d7c86fe47a517b60b576e11186a Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Wed, 1 Apr 2015 21:56:25 -0500 Subject: [PATCH 2/6] check username/password before real login --- rtv/docs.py | 2 +- rtv/page.py | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/rtv/docs.py b/rtv/docs.py index f6b0e3c..988583a 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -31,7 +31,7 @@ Global Commands `r` : Refresh the current page `q` : Quit the program `ENTER` or `o` : Open the selected item in the default web browser - `+` : Log in + `u` : Log in `?` : Show this help message Subreddit Mode diff --git a/rtv/page.py b/rtv/page.py index 43f26c3..0cda610 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -6,6 +6,7 @@ import praw.errors from .helpers import clean from .curses_helpers import Color, show_notification, show_help, text_input +from .docs import AGENT __all__ = ['Navigator'] @@ -226,21 +227,31 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) - @BaseController.register('+') + @BaseController.register('u') def login(self): username = self.prompt_input('Enter username: ') password = self.prompt_input('Enter password: ', hide=True) - if (username == '') or (password == ''): + if username == '' or username is None: + self.reddit.clear_authentication() + show_notification(self.stdscr, + ['Logged out']) + return + elif password == '' or password is None: curses.flash() return + try: - self.reddit.login(username, password) - + curses.endwin() + print('Connecting...') + _reddit = praw.Reddit(user_agent=AGENT) + _reddit.login(username, password) + curses.doupdate() except praw.errors.InvalidUserPass: show_notification(self.stdscr, ['Invalid password for username: {}'.format(username)]) else: + self.reddit.login(username, password) show_notification(self.stdscr, ['Successfully logged in as: {}'.format(username)]) @@ -252,7 +263,8 @@ class BasePage(object): n_rows, n_cols = self.stdscr.getmaxyx() if hide: - self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_rows-1-len(prompt)), attr) + self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_cols-1-len(prompt)), + attr) out = self.stdscr.getstr(n_rows-1, 1) else: self.stdscr.addstr(n_rows - 1, 0, prompt, attr) From 943bc34fbf8da6550036e1236085330f021d752a Mon Sep 17 00:00:00 2001 From: Tobin Date: Thu, 2 Apr 2015 01:46:46 -0500 Subject: [PATCH 3/6] added program title to terminal title --- rtv/__main__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rtv/__main__.py b/rtv/__main__.py index bf8779c..cef78c1 100644 --- a/rtv/__main__.py +++ b/rtv/__main__.py @@ -15,6 +15,7 @@ from .curses_helpers import curses_session from .submission import SubmissionPage from .subreddit import SubredditPage from .docs import * +from .__version__ import __version__ __all__ = [] @@ -68,6 +69,13 @@ def main(): args = command_line() local_config = load_config() + # set the terminal title + title = 'rtv {0}'.format(__version__) + try: + sys.stdout.write("\x1b]2;{0}\x07".format(title)) + except: + os.system(title) + # Fill in empty arguments with config file values. Paramaters explicitly # typed on the command line will take priority over config file params. for key, val in local_config.items(): From c7a760791a6e9c168f5ff73dc614853bfdc89d0f Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Thu, 2 Apr 2015 02:11:03 -0500 Subject: [PATCH 4/6] prompt to log out/in when logged in/out --- rtv/curses_helpers.py | 4 +++- rtv/page.py | 55 ++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/rtv/curses_helpers.py b/rtv/curses_helpers.py index f9a2085..ee9fdaf 100644 --- a/rtv/curses_helpers.py +++ b/rtv/curses_helpers.py @@ -52,12 +52,14 @@ def show_notification(stdscr, message): for index, line in enumerate(message, start=1): window.addstr(index, 1, line) window.refresh() - stdscr.getch() + ch = stdscr.getch() window.clear() window = None stdscr.refresh() + return ch + def show_help(stdscr): """ diff --git a/rtv/page.py b/rtv/page.py index 0cda610..65e21c3 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -229,34 +229,41 @@ class BasePage(object): @BaseController.register('u') def login(self): - username = self.prompt_input('Enter username: ') - password = self.prompt_input('Enter password: ', hide=True) + """ + Prompt to log out if logged in. + Prompt to log in if looged out. + """ + + if self.reddit.is_logged_in(): + ch = show_notification(self.stdscr, ["Log out? (y/N)"]) + + if ch == 121: # 'y' + self.reddit.clear_authentication() + show_notification(self.stdscr, + ['Logged out']) + else: + curses.flash() - if username == '' or username is None: - self.reddit.clear_authentication() - show_notification(self.stdscr, - ['Logged out']) - return - elif password == '' or password is None: - curses.flash() - return - - try: - curses.endwin() - print('Connecting...') - _reddit = praw.Reddit(user_agent=AGENT) - _reddit.login(username, password) - curses.doupdate() - except praw.errors.InvalidUserPass: - show_notification(self.stdscr, - ['Invalid password for username: {}'.format(username)]) else: - self.reddit.login(username, password) - show_notification(self.stdscr, - ['Successfully logged in as: {}'.format(username)]) + username = self.prompt_input('Enter username: ') + password = self.prompt_input('Enter password: ', hide=True) + + if (username == '' or username is None) \ + or (password == '' or password is None): + curses.flash() + return + + try: + self.reddit.login(username, password) + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, + ['Invalid password for username: {}'.format(username)]) + else: + show_notification(self.stdscr, + ['Successfully logged in as: {}'.format(username)]) return - + def prompt_input(self, prompt, hide=False): """Prompt the user for input""" attr = curses.A_BOLD | Color.CYAN From 2141fe6e31e03d956a8f3d7c66621042adde87d5 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 2 Apr 2015 09:59:23 -0700 Subject: [PATCH 5/6] Cleaned up user login. --- rtv/page.py | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/rtv/page.py b/rtv/page.py index 65e21c3..70d13f6 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -230,39 +230,38 @@ class BasePage(object): @BaseController.register('u') def login(self): """ - Prompt to log out if logged in. - Prompt to log in if looged out. + Prompt to log into the user's account. Log out if the user is already + logged in. """ if self.reddit.is_logged_in(): - ch = show_notification(self.stdscr, ["Log out? (y/N)"]) + self.logout() + return - if ch == 121: # 'y' - self.reddit.clear_authentication() - show_notification(self.stdscr, - ['Logged out']) - else: - curses.flash() + username = self.prompt_input('Enter username:') + password = self.prompt_input('Enter password:', hide=True) + if not username or not password: + curses.flash() + return + try: + self.reddit.login(username, password) + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, ['Invalid user/pass']) else: - username = self.prompt_input('Enter username: ') - password = self.prompt_input('Enter password: ', hide=True) + show_notification(self.stdscr, ['Logged in']) - if (username == '' or username is None) \ - or (password == '' or password is None): - curses.flash() - return + def logout(self): + """ + Prompt to log out of the user's account. + """ - try: - self.reddit.login(username, password) - except praw.errors.InvalidUserPass: - show_notification(self.stdscr, - ['Invalid password for username: {}'.format(username)]) - else: - show_notification(self.stdscr, - ['Successfully logged in as: {}'.format(username)]) - - return + ch = self.prompt_input("Log out? (y/n):") + if ch == 'y': + self.reddit.clear_authentication() + show_notification(self.stdscr, ['Logged out']) + elif ch != 'n': + curses.flash() def prompt_input(self, prompt, hide=False): """Prompt the user for input""" @@ -270,18 +269,17 @@ class BasePage(object): n_rows, n_cols = self.stdscr.getmaxyx() if hide: - self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_cols-1-len(prompt)), - attr) + prompt += ' ' * (n_cols - len(prompt) - 1) + self.stdscr.addstr(n_rows-1, 0, prompt, attr) out = self.stdscr.getstr(n_rows-1, 1) else: self.stdscr.addstr(n_rows - 1, 0, prompt, attr) self.stdscr.refresh() window = self.stdscr.derwin(1, n_cols - len(prompt), - n_rows - 1, len(prompt)) + n_rows - 1, len(prompt)) window.attrset(attr) - out = text_input(window) - + return out def draw(self): From 8f14be279713920eda7432d721b159cdad6b468e Mon Sep 17 00:00:00 2001 From: Tobin Date: Thu, 2 Apr 2015 12:43:02 -0500 Subject: [PATCH 6/6] fixed title for windows --- rtv/__main__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtv/__main__.py b/rtv/__main__.py index cef78c1..44b5bd8 100644 --- a/rtv/__main__.py +++ b/rtv/__main__.py @@ -71,10 +71,10 @@ def main(): # set the terminal title title = 'rtv {0}'.format(__version__) - try: + if os.name == 'nt': + os.system('title {0}'.format(title)) + else: sys.stdout.write("\x1b]2;{0}\x07".format(title)) - except: - os.system(title) # Fill in empty arguments with config file values. Paramaters explicitly # typed on the command line will take priority over config file params.