mirror of
https://github.com/paul-nameless/tg
synced 2024-11-29 07:10:19 +00:00
Add checks for sending, deleting, forwarding (#72)
* Check if msg can be deleted * Check if msg can be sent in current chat * Fix is can be deleted * Check is msg can be forwarded
This commit is contained in:
parent
29585ae972
commit
468950bc6a
2 changed files with 61 additions and 22 deletions
|
@ -129,16 +129,10 @@ class Controller:
|
||||||
self.present_info("Copied msg")
|
self.present_info("Copied msg")
|
||||||
|
|
||||||
def forward_msgs(self):
|
def forward_msgs(self):
|
||||||
# TODO: check <can_be_forwarded> flag
|
if not self.model.forward_msgs():
|
||||||
chat_id = self.model.chats.id_by_index(self.model.current_chat)
|
self.present_error("Can't forward msg(s)")
|
||||||
if not chat_id:
|
|
||||||
return
|
return
|
||||||
from_chat_id, msg_ids = self.model.yanked_msgs
|
self.present_info("Forwarded msg(s)")
|
||||||
if not msg_ids:
|
|
||||||
return
|
|
||||||
self.tg.forward_messages(chat_id, from_chat_id, msg_ids)
|
|
||||||
self.present_info(f"Forwarded {len(msg_ids)} messages")
|
|
||||||
self.model.yanked_msgs = (0, [])
|
|
||||||
|
|
||||||
def copy_msgs(self):
|
def copy_msgs(self):
|
||||||
chat_id = self.model.chats.id_by_index(self.model.current_chat)
|
chat_id = self.model.chats.id_by_index(self.model.current_chat)
|
||||||
|
@ -239,8 +233,14 @@ class Controller:
|
||||||
with suspend(self.view):
|
with suspend(self.view):
|
||||||
breakpoint()
|
breakpoint()
|
||||||
|
|
||||||
|
def can_send_msg(self) -> bool:
|
||||||
|
chat = self.model.chats.chats[self.model.current_chat]
|
||||||
|
return chat["permissions"]["can_send_messages"]
|
||||||
|
|
||||||
def reply_message(self):
|
def reply_message(self):
|
||||||
# write new message
|
if not self.can_send_msg():
|
||||||
|
self.present_info("Can't send msg in this chat")
|
||||||
|
return
|
||||||
chat_id = self.model.current_chat_id
|
chat_id = self.model.current_chat_id
|
||||||
reply_to_msg = self.model.current_msg_id
|
reply_to_msg = self.model.current_msg_id
|
||||||
if msg := self.view.status.get_input():
|
if msg := self.view.status.get_input():
|
||||||
|
@ -250,6 +250,9 @@ class Controller:
|
||||||
self.present_info("Message reply wasn't sent")
|
self.present_info("Message reply wasn't sent")
|
||||||
|
|
||||||
def reply_with_long_message(self):
|
def reply_with_long_message(self):
|
||||||
|
if not self.can_send_msg():
|
||||||
|
self.present_info("Can't send msg in this chat")
|
||||||
|
return
|
||||||
chat_id = self.model.current_chat_id
|
chat_id = self.model.current_chat_id
|
||||||
reply_to_msg = self.model.current_msg_id
|
reply_to_msg = self.model.current_msg_id
|
||||||
msg = MsgProxy(self.model.current_msg)
|
msg = MsgProxy(self.model.current_msg)
|
||||||
|
@ -267,13 +270,28 @@ class Controller:
|
||||||
self.present_info("Message wasn't sent")
|
self.present_info("Message wasn't sent")
|
||||||
|
|
||||||
def write_short_msg(self):
|
def write_short_msg(self):
|
||||||
# write new message
|
if not self.can_send_msg():
|
||||||
|
self.present_info("Can't send msg in this chat")
|
||||||
|
return
|
||||||
if msg := self.view.status.get_input():
|
if msg := self.view.status.get_input():
|
||||||
self.model.send_message(text=msg)
|
self.model.send_message(text=msg)
|
||||||
self.present_info("Message sent")
|
self.present_info("Message sent")
|
||||||
else:
|
else:
|
||||||
self.present_info("Message wasn't sent")
|
self.present_info("Message wasn't sent")
|
||||||
|
|
||||||
|
def write_long_msg(self):
|
||||||
|
if not self.can_send_msg():
|
||||||
|
self.present_info("Can't send msg in this chat")
|
||||||
|
return
|
||||||
|
with NamedTemporaryFile("r+", suffix=".txt") as f, suspend(
|
||||||
|
self.view
|
||||||
|
) as s:
|
||||||
|
s.call(config.LONG_MSG_CMD.format(file_path=f.name))
|
||||||
|
with open(f.name) as f:
|
||||||
|
if msg := f.read().strip():
|
||||||
|
self.model.send_message(text=msg)
|
||||||
|
self.present_info("Message sent")
|
||||||
|
|
||||||
def send_video(self):
|
def send_video(self):
|
||||||
file_path = self.view.status.get_input()
|
file_path = self.view.status.get_input()
|
||||||
if not file_path or not os.path.isfile(file_path):
|
if not file_path or not os.path.isfile(file_path):
|
||||||
|
@ -286,8 +304,11 @@ class Controller:
|
||||||
self.tg.send_video(file_path, chat_id, width, height, duration)
|
self.tg.send_video(file_path, chat_id, width, height, duration)
|
||||||
|
|
||||||
def delete_msgs(self):
|
def delete_msgs(self):
|
||||||
self.model.delete_msgs()
|
is_deleted = self.model.delete_msgs()
|
||||||
self.discard_selected_msgs()
|
self.discard_selected_msgs()
|
||||||
|
if not is_deleted:
|
||||||
|
self.present_error("Can't delete msg(s)")
|
||||||
|
return
|
||||||
self.present_info("Message deleted")
|
self.present_info("Message deleted")
|
||||||
|
|
||||||
def send_file(self, send_file_fun, *args, **kwargs):
|
def send_file(self, send_file_fun, *args, **kwargs):
|
||||||
|
@ -390,16 +411,6 @@ class Controller:
|
||||||
self.model.edit_message(text=text)
|
self.model.edit_message(text=text)
|
||||||
self.present_info("Message edited")
|
self.present_info("Message edited")
|
||||||
|
|
||||||
def write_long_msg(self):
|
|
||||||
with NamedTemporaryFile("r+", suffix=".txt") as f, suspend(
|
|
||||||
self.view
|
|
||||||
) as s:
|
|
||||||
s.call(config.LONG_MSG_CMD.format(file_path=f.name))
|
|
||||||
with open(f.name) as f:
|
|
||||||
if msg := f.read().strip():
|
|
||||||
self.model.send_message(text=msg)
|
|
||||||
self.present_info("Message sent")
|
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
try:
|
try:
|
||||||
self.handle(self.chat_bindings, 0.5)
|
self.handle(self.chat_bindings, 0.5)
|
||||||
|
|
28
tg/models.py
28
tg/models.py
|
@ -136,6 +136,11 @@ class Model:
|
||||||
return self.msgs.edit_message(chat_id, self.current_msg_id, text)
|
return self.msgs.edit_message(chat_id, self.current_msg_id, text)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def can_be_deleted(self, chat_id: int, msg: Dict[str, Any]) -> bool:
|
||||||
|
if chat_id == msg["sender_user_id"]:
|
||||||
|
return msg["can_be_deleted_only_for_self"]
|
||||||
|
return msg["can_be_deleted_for_all_users"]
|
||||||
|
|
||||||
def delete_msgs(self) -> bool:
|
def delete_msgs(self) -> bool:
|
||||||
chat_id = self.chats.id_by_index(self.current_chat)
|
chat_id = self.chats.id_by_index(self.current_chat)
|
||||||
if not chat_id:
|
if not chat_id:
|
||||||
|
@ -143,13 +148,36 @@ class Model:
|
||||||
msg_ids = self.selected[chat_id]
|
msg_ids = self.selected[chat_id]
|
||||||
if msg_ids:
|
if msg_ids:
|
||||||
message_ids = msg_ids
|
message_ids = msg_ids
|
||||||
|
for msg_id in message_ids:
|
||||||
|
msg = self.msgs.get_message(chat_id, msg_id)
|
||||||
|
if not self.can_be_deleted(chat_id, msg):
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
selected_msg = self.msgs.current_msgs[chat_id]
|
selected_msg = self.msgs.current_msgs[chat_id]
|
||||||
msg = self.msgs.msgs[chat_id][selected_msg]
|
msg = self.msgs.msgs[chat_id][selected_msg]
|
||||||
|
if not self.can_be_deleted(chat_id, msg):
|
||||||
|
return False
|
||||||
message_ids = [msg["id"]]
|
message_ids = [msg["id"]]
|
||||||
|
|
||||||
log.info(f"Deleting msg from the chat {chat_id}: {message_ids}")
|
log.info(f"Deleting msg from the chat {chat_id}: {message_ids}")
|
||||||
self.tg.delete_messages(chat_id, message_ids, revoke=True)
|
self.tg.delete_messages(chat_id, message_ids, revoke=True)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def forward_msgs(self) -> bool:
|
||||||
|
chat_id = self.chats.id_by_index(self.current_chat)
|
||||||
|
if not chat_id:
|
||||||
|
return False
|
||||||
|
from_chat_id, msg_ids = self.yanked_msgs
|
||||||
|
if not msg_ids:
|
||||||
|
return False
|
||||||
|
for msg_id in msg_ids:
|
||||||
|
msg = self.msgs.get_message(from_chat_id, msg_id)
|
||||||
|
if not msg["can_be_forwarded"]:
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.tg.forward_messages(chat_id, from_chat_id, msg_ids)
|
||||||
|
self.yanked_msgs = (0, [])
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class ChatModel:
|
class ChatModel:
|
||||||
|
|
Loading…
Reference in a new issue