From f23596a0d1daa67bc2e4e7f9efc05a9f152cfda4 Mon Sep 17 00:00:00 2001 From: Nameless Date: Sat, 16 May 2020 17:33:42 +0800 Subject: [PATCH] Add u: read/unread, r: read all chat msgs, p: pin/unpin, m: mute/unmute (#36) * Add u: read/unread, r: read all chat msgs, p: pin/unpin, m: mute/unmute Co-authored-by: Paul Nameless Co-authored-by: Alexander Zveruk --- tg/controllers/__init__.py | 60 +++++++++++++++++++++++++++++++++----- tg/main.py | 40 +++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/tg/controllers/__init__.py b/tg/controllers/__init__.py index 1b12965..0eabe50 100644 --- a/tg/controllers/__init__.py +++ b/tg/controllers/__init__.py @@ -1,9 +1,9 @@ import logging -from typing import Dict, Any, Optional import os import threading from datetime import datetime from tempfile import NamedTemporaryFile +from typing import Any, Dict, Optional from telegram.client import Telegram @@ -47,17 +47,18 @@ class Controller: self.lock = threading.Lock() self.tg = tg self.handlers = { - "updateNewMessage": self.update_new_msg, - "updateMessageContent": self.update_msg_content, - "updateChatIsPinned": self.update_chat_is_pinned, + "updateChatDraftMessage": self.update_chat_draft_msg, "updateChatIsMarkedAsUnread": self.update_chat_marked_as_unread, + "updateChatIsPinned": self.update_chat_is_pinned, + "updateChatLastMessage": self.update_chat_last_msg, + "updateChatNotificationSettings": self.update_chat_notification_settings, + "updateChatOrder": self.update_chat_order, "updateChatReadInbox": self.update_chat_read_inbox, "updateChatTitle": self.update_chat_title, - "updateChatLastMessage": self.update_chat_last_msg, - "updateChatDraftMessage": self.update_chat_draft_msg, - "updateChatOrder": self.update_chat_order, - "updateMessageSendSucceeded": self.update_msg_send_succeeded, "updateFile": self.update_file, + "updateMessageContent": self.update_msg_content, + "updateMessageSendSucceeded": self.update_msg_send_succeeded, + "updateNewMessage": self.update_new_msg, } def send_file(self, send_file_fun, *args, **kwargs): @@ -258,6 +259,39 @@ class Controller: with suspend(self.view): breakpoint() + elif keys == "u": + chat = self.model.chats.chats[self.model.current_chat] + chat_id = chat["id"] + toggle = not chat["is_marked_as_unread"] + self.tg.toggle_chat_is_marked_as_unread(chat_id, toggle) + + elif keys == "p": + chat = self.model.chats.chats[self.model.current_chat] + chat_id = chat["id"] + toggle = not chat["is_pinned"] + self.tg.toggle_chat_is_pinned(chat_id, toggle) + + elif keys == "r": + chat = self.model.chats.chats[self.model.current_chat] + chat_id = chat["id"] + msg_id = chat["last_message"]["id"] + self.tg.view_messages(chat_id, [msg_id]) + + elif keys == "m": + # TODO: if it's msg to yourself, do not change its + # notification setting, because we can't by documentation, + # instead write about it in status + chat = self.model.chats.chats[self.model.current_chat] + chat_id = chat["id"] + notification_settings = chat["notification_settings"] + if notification_settings["mute_for"]: + notification_settings["mute_for"] = 0 + else: + notification_settings["mute_for"] = 2147483647 + self.tg.set_chat_nottification_settings( + chat_id, notification_settings + ) + def refresh_chats(self) -> None: with self.lock: # using lock here, because refresh_chats is used from another @@ -427,6 +461,16 @@ class Controller: break self.refresh_chats() + @handle_exception + def update_chat_notification_settings(self, update): + log.info("Proccessing update_chat_notification_settings") + chat_id = update["chat_id"] + notification_settings = update["notification_settings"] + self.model.chats.update_chat( + chat_id, notification_settings=notification_settings + ) + self.refresh_chats() + @handle_exception def update_msg_send_succeeded(self, update): chat_id = update["message"]["chat_id"] diff --git a/tg/main.py b/tg/main.py index 19afd15..8088c80 100644 --- a/tg/main.py +++ b/tg/main.py @@ -106,6 +106,45 @@ class TelegramApi(Telegram): } return self._send_data(data) + def toggle_chat_is_marked_as_unread( + self, chat_id: int, is_marked_as_unread: bool + ): + data = { + "@type": "toggleChatIsMarkedAsUnread", + "chat_id": chat_id, + "is_marked_as_unread": is_marked_as_unread, + } + return self._send_data(data) + + def toggle_chat_is_pinned(self, chat_id: int, is_pinned: bool): + data = { + "@type": "toggleChatIsPinned", + "chat_id": chat_id, + "is_pinned": is_pinned, + } + return self._send_data(data) + + def set_chat_nottification_settings( + self, chat_id: int, notification_settings: dict + ): + data = { + "@type": "setChatNotificationSettings", + "chat_id": chat_id, + "notification_settings": notification_settings, + } + return self._send_data(data) + + def view_messages( + self, chat_id: int, message_ids: list, force_read: bool = True + ): + data = { + "@type": "viewMessages", + "chat_id": chat_id, + "message_ids": message_ids, + "force_read": force_read, + } + return self._send_data(data) + def main(): def signal_handler(sig, frame): @@ -130,6 +169,7 @@ def main(): ) config.record_cmd = cfg.get("record_cmd") tg.login() + wrapper(partial(run, tg))