mirror of
https://github.com/paul-nameless/tg
synced 2024-11-22 11:53:08 +00:00
Add bility to jump to bottom in msgs
Add support for arrow keys
This commit is contained in:
parent
73065f5f45
commit
e4ead029a0
3 changed files with 77 additions and 54 deletions
|
@ -51,14 +51,18 @@ class Controller:
|
||||||
elif key == 'K':
|
elif key == 'K':
|
||||||
if self.model.jump_prev_msg():
|
if self.model.jump_prev_msg():
|
||||||
self.refresh_msgs()
|
self.refresh_msgs()
|
||||||
elif key == 'j':
|
elif key in ('j', '^B'):
|
||||||
if self.model.next_msg():
|
if self.model.next_msg():
|
||||||
self.refresh_msgs()
|
self.refresh_msgs()
|
||||||
elif key == 'k':
|
elif key in ('k', '^C'):
|
||||||
if self.model.prev_msg():
|
if self.model.prev_msg():
|
||||||
self.refresh_msgs()
|
self.refresh_msgs()
|
||||||
elif key == 'G':
|
elif key == 'G':
|
||||||
# move to the bottom
|
if self.model.jump_bottom():
|
||||||
|
self.refresh_msgs()
|
||||||
|
|
||||||
|
elif key == '/':
|
||||||
|
# search
|
||||||
pass
|
pass
|
||||||
elif key == 'gg':
|
elif key == 'gg':
|
||||||
# move to the top
|
# move to the top
|
||||||
|
@ -82,8 +86,9 @@ class Controller:
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
text=msg,
|
text=msg,
|
||||||
)
|
)
|
||||||
|
self.view.draw_status(f'Sent: {msg}')
|
||||||
|
|
||||||
elif key == 'h':
|
elif key in ('h', '^D'):
|
||||||
return 'BACK'
|
return 'BACK'
|
||||||
|
|
||||||
def handle_chats(self):
|
def handle_chats(self):
|
||||||
|
@ -98,7 +103,7 @@ class Controller:
|
||||||
logger.info('Pressed key: %s', key)
|
logger.info('Pressed key: %s', key)
|
||||||
if key == 'q':
|
if key == 'q':
|
||||||
return
|
return
|
||||||
elif key == 'l':
|
elif key in ('l', '^E'):
|
||||||
rc = self.handle_msgs()
|
rc = self.handle_msgs()
|
||||||
if rc == 'QUIT':
|
if rc == 'QUIT':
|
||||||
return
|
return
|
||||||
|
@ -106,12 +111,12 @@ class Controller:
|
||||||
self.view.msgs.resize(0.5)
|
self.view.msgs.resize(0.5)
|
||||||
self.refresh_chats()
|
self.refresh_chats()
|
||||||
|
|
||||||
elif key == 'j':
|
elif key in ('j', '^B'):
|
||||||
is_changed = self.model.next_chat()
|
is_changed = self.model.next_chat()
|
||||||
if is_changed:
|
if is_changed:
|
||||||
self.refresh_chats()
|
self.refresh_chats()
|
||||||
|
|
||||||
elif key == 'k':
|
elif key in ('k', '^C'):
|
||||||
is_changed = self.model.prev_chat()
|
is_changed = self.model.prev_chat()
|
||||||
if is_changed:
|
if is_changed:
|
||||||
self.refresh_chats()
|
self.refresh_chats()
|
||||||
|
@ -136,13 +141,13 @@ class Controller:
|
||||||
# with self.lock:
|
# with self.lock:
|
||||||
chat_id = update['message']['chat_id']
|
chat_id = update['message']['chat_id']
|
||||||
self.model.msgs.msgs[chat_id].append(update['message'])
|
self.model.msgs.msgs[chat_id].append(update['message'])
|
||||||
msgs = self.model.get_current_msgs()
|
# msgs = self.model.get_current_msgs()
|
||||||
self.refresh_msgs()
|
self.refresh_msgs()
|
||||||
try:
|
if not update['disable_notification']:
|
||||||
notify(update['message']['content']['text']['text'])
|
try:
|
||||||
except Exception:
|
notify(update['message']['content']['text']['text'])
|
||||||
logger.exception(
|
except Exception:
|
||||||
'Error happened on notify: %s', update['message'])
|
logger.exception('Error happened on notify: %s', update)
|
||||||
# message_content = update['message']['content'].get('text', {})
|
# message_content = update['message']['content'].get('text', {})
|
||||||
# we need this because of different message types: photos, files, etc.
|
# we need this because of different message types: photos, files, etc.
|
||||||
# message_text = message_content.get('text', '').lower()
|
# message_text = message_content.get('text', '').lower()
|
||||||
|
|
10
model.py
10
model.py
|
@ -18,6 +18,10 @@ class Model:
|
||||||
def get_current_msg(self):
|
def get_current_msg(self):
|
||||||
return self.msgs.current_msgs[self.get_current_chat_id()]
|
return self.msgs.current_msgs[self.get_current_chat_id()]
|
||||||
|
|
||||||
|
def jump_bottom(self):
|
||||||
|
chat_id = self.chats.chat_ids[self.current_chat]
|
||||||
|
return self.msgs.jump_bottom(chat_id)
|
||||||
|
|
||||||
def next_chat(self):
|
def next_chat(self):
|
||||||
if self.current_chat < len(self.chats.chats):
|
if self.current_chat < len(self.chats.chats):
|
||||||
self.current_chat += 1
|
self.current_chat += 1
|
||||||
|
@ -145,6 +149,12 @@ class MsgModel:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def jump_bottom(self, chat_id):
|
||||||
|
if self.current_msgs[chat_id] == 0:
|
||||||
|
return False
|
||||||
|
self.current_msgs[chat_id] = 0
|
||||||
|
return True
|
||||||
|
|
||||||
def jump_next_msg(self, chat_id):
|
def jump_next_msg(self, chat_id):
|
||||||
if self.current_msgs[chat_id] - 10 > 0:
|
if self.current_msgs[chat_id] - 10 > 0:
|
||||||
self.current_msgs[chat_id] -= 10
|
self.current_msgs[chat_id] -= 10
|
||||||
|
|
90
view.py
90
view.py
|
@ -52,41 +52,7 @@ class View:
|
||||||
# return curses.unctrl(ch).decode()
|
# return curses.unctrl(ch).decode()
|
||||||
|
|
||||||
def get_input(self):
|
def get_input(self):
|
||||||
curses.curs_set(1)
|
return self.status.get_input()
|
||||||
|
|
||||||
buff = ''
|
|
||||||
while True:
|
|
||||||
key = self.msgs.win.get_wch(
|
|
||||||
self.msgs.h-1, min(len(buff), self.msgs.w-1))
|
|
||||||
key = ord(key)
|
|
||||||
logger.info('Pressed in send msg: "%s"', key)
|
|
||||||
# try:
|
|
||||||
logger.info('Trying to chr: %s', chr(key))
|
|
||||||
# except ValueError:
|
|
||||||
# logger.exception()
|
|
||||||
if key == 10: # return
|
|
||||||
logger.info('Sending msg: %s', buff)
|
|
||||||
break
|
|
||||||
elif key == 127: # del
|
|
||||||
if buff:
|
|
||||||
buff = buff[:-1]
|
|
||||||
elif key == 7: # ^G cancel
|
|
||||||
logger.info('Not Sending msg: %s', buff)
|
|
||||||
buff = None
|
|
||||||
break
|
|
||||||
elif chr(key).isprintable():
|
|
||||||
buff += chr(key)
|
|
||||||
if len(buff) >= self.msgs.w:
|
|
||||||
start = len(buff) - self.msgs.w
|
|
||||||
buff_wrapped = buff[start+1:]
|
|
||||||
else:
|
|
||||||
buff_wrapped = (buff + ' ' * (self.msgs.w -
|
|
||||||
len(buff) - 1))
|
|
||||||
self.msgs.win.addstr(self.msgs.h-1, 0, buff_wrapped)
|
|
||||||
self.msgs.win.move(self.msgs.h-1, min(len(buff), self.msgs.w-1))
|
|
||||||
|
|
||||||
curses.curs_set(0)
|
|
||||||
return buff
|
|
||||||
|
|
||||||
|
|
||||||
class StatusView:
|
class StatusView:
|
||||||
|
@ -105,8 +71,49 @@ class StatusView:
|
||||||
self.win.wmove(self.y, self.x)
|
self.win.wmove(self.y, self.x)
|
||||||
|
|
||||||
def draw(self, msg):
|
def draw(self, msg):
|
||||||
msg = '-' * (self.w - 1)
|
# msg = '-' * (self.w - 1)
|
||||||
self.win.addstr(0, 0, msg)
|
# msg = '>'
|
||||||
|
if not msg:
|
||||||
|
msg = 'Status'
|
||||||
|
self.win.addstr(0, 0, msg[:self.w])
|
||||||
|
self.win.refresh()
|
||||||
|
|
||||||
|
def get_input(self):
|
||||||
|
curses.curs_set(1)
|
||||||
|
self.win.clear()
|
||||||
|
|
||||||
|
buff = ''
|
||||||
|
while True:
|
||||||
|
key = self.win.get_wch(0, min(len(buff), self.w-1))
|
||||||
|
key = ord(key)
|
||||||
|
logger.info('Pressed in send msg: "%s"', key)
|
||||||
|
# try:
|
||||||
|
logger.info('Trying to chr: %s', chr(key))
|
||||||
|
# except ValueError:
|
||||||
|
# logger.exception()
|
||||||
|
if key == 10: # return
|
||||||
|
logger.info('Sending msg: %s', buff)
|
||||||
|
break
|
||||||
|
elif key == 127: # del
|
||||||
|
if buff:
|
||||||
|
buff = buff[:-1]
|
||||||
|
elif key == 7: # ^G cancel
|
||||||
|
logger.info('Not Sending msg: %s', buff)
|
||||||
|
buff = None
|
||||||
|
break
|
||||||
|
elif chr(key).isprintable():
|
||||||
|
buff += chr(key)
|
||||||
|
if len(buff) >= self.w:
|
||||||
|
start = len(buff) - self.w
|
||||||
|
buff_wrapped = buff[start+1:]
|
||||||
|
else:
|
||||||
|
buff_wrapped = (buff + ' ' * (self.w -
|
||||||
|
len(buff) - 1))
|
||||||
|
self.win.addstr(0, 0, buff_wrapped)
|
||||||
|
self.win.move(0, min(len(buff), self.w-1))
|
||||||
|
|
||||||
|
curses.curs_set(0)
|
||||||
|
return buff
|
||||||
|
|
||||||
|
|
||||||
class ChatView:
|
class ChatView:
|
||||||
|
@ -126,8 +133,9 @@ class ChatView:
|
||||||
self.win.clear()
|
self.win.clear()
|
||||||
# self.win.vline(0, self.w-1, curses.ACS_VLINE, self.h)
|
# self.win.vline(0, self.w-1, curses.ACS_VLINE, self.h)
|
||||||
for i, chat in enumerate(chats):
|
for i, chat in enumerate(chats):
|
||||||
msg = f'{get_date(chat)} {chat["title"]} [{chat["unread_count"]}]: {get_last_msg(chat)}'
|
msg = f' {get_date(chat)} {chat["title"]} [{chat["unread_count"]}]: {get_last_msg(chat)}'
|
||||||
msg = emoji_pattern.sub(r'', msg)[:self.w-1]
|
# msg = emoji_pattern.sub(r'', msg)[:self.w-1]
|
||||||
|
msg = emoji_pattern.sub(r'', msg)[:self.w-2] + ' '
|
||||||
# msg = msg[:self.w-1]
|
# msg = msg[:self.w-1]
|
||||||
if len(msg) < self.w:
|
if len(msg) < self.w:
|
||||||
msg += ' ' * (self.w - len(msg) - 1)
|
msg += ' ' * (self.w - len(msg) - 1)
|
||||||
|
@ -194,13 +202,13 @@ class MsgView:
|
||||||
msg['date']).strftime("%H:%M:%S")
|
msg['date']).strftime("%H:%M:%S")
|
||||||
_type = msg['@type']
|
_type = msg['@type']
|
||||||
if _type == 'message':
|
if _type == 'message':
|
||||||
return "{} {}: {}".format(
|
return " {} {}: {}".format(
|
||||||
dt,
|
dt,
|
||||||
msg['sender_user_id'],
|
msg['sender_user_id'],
|
||||||
parse_content(msg['content'])
|
parse_content(msg['content'])
|
||||||
)
|
)
|
||||||
logger.debug('Unknown message type: %s', msg)
|
logger.debug('Unknown message type: %s', msg)
|
||||||
return 'unknown msg type: ' + str(msg['content'])
|
return ' unknown msg type: ' + str(msg['content'])
|
||||||
|
|
||||||
|
|
||||||
def get_last_msg(chat):
|
def get_last_msg(chat):
|
||||||
|
|
Loading…
Reference in a new issue