server: Support printing out sent messages before finishing the request.
This commit is contained in:
parent
286b15aa86
commit
fd9053eacd
3 changed files with 127 additions and 5 deletions
|
@ -57,6 +57,7 @@ OwnMessages = NamedTuple(
|
||||||
("sender", str),
|
("sender", str),
|
||||||
("age", int),
|
("age", int),
|
||||||
("event_id", str),
|
("event_id", str),
|
||||||
|
("uuid", str),
|
||||||
("room_id", str),
|
("room_id", str),
|
||||||
("formatted_message", Formatted),
|
("formatted_message", Formatted),
|
||||||
],
|
],
|
||||||
|
@ -1242,7 +1243,10 @@ class RoomBuffer(object):
|
||||||
# type: (OwnMessage) -> None
|
# type: (OwnMessage) -> None
|
||||||
nick = self.find_nick(self.room.own_user_id)
|
nick = self.find_nick(self.room.own_user_id)
|
||||||
data = message.formatted_message.to_weechat()
|
data = message.formatted_message.to_weechat()
|
||||||
|
if message.event_id:
|
||||||
tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
|
tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
|
||||||
|
else:
|
||||||
|
tags = [SCRIPT_NAME + "_uuid_{}".format(message.uuid)]
|
||||||
date = message.age
|
date = message.age
|
||||||
|
|
||||||
self.weechat_buffer.self_message(nick, data, date, tags)
|
self.weechat_buffer.self_message(nick, data, date, tags)
|
||||||
|
@ -1251,12 +1255,60 @@ class RoomBuffer(object):
|
||||||
# type: (OwnMessage) -> None
|
# type: (OwnMessage) -> None
|
||||||
nick = self.find_nick(self.room.own_user_id)
|
nick = self.find_nick(self.room.own_user_id)
|
||||||
date = message.age
|
date = message.age
|
||||||
|
if message.event_id:
|
||||||
tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
|
tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
|
||||||
|
else:
|
||||||
|
tags = [SCRIPT_NAME + "_uuid_{}".format(message.uuid)]
|
||||||
|
|
||||||
self.weechat_buffer.self_action(
|
self.weechat_buffer.self_action(
|
||||||
nick, message.formatted_message.to_weechat(), date, tags
|
nick, message.formatted_message.to_weechat(), date, tags
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _find_by_uuid_predicate(uuid, line):
|
||||||
|
uuid_tag = SCRIPT_NAME + "_uuid_{}".format(uuid)
|
||||||
|
tags = line.tags
|
||||||
|
|
||||||
|
if uuid_tag in tags:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def mark_message_as_unsent(self, uuid, _):
|
||||||
|
"""Append to already printed lines that are greyed out an error
|
||||||
|
message"""
|
||||||
|
lines = self.weechat_buffer.find_lines(
|
||||||
|
partial(self._find_by_uuid_predicate, uuid)
|
||||||
|
)
|
||||||
|
last_line = lines[-1]
|
||||||
|
|
||||||
|
message = last_line.message
|
||||||
|
message += (" {del_color}<{ncolor}{error_color}Error sending "
|
||||||
|
"message{del_color}>{ncolor}").format(
|
||||||
|
del_color=W.color("chat_delimiters"),
|
||||||
|
ncolor=W.color("reset"),
|
||||||
|
error_color=W.color(G.CONFIG.color.error_message))
|
||||||
|
|
||||||
|
last_line.message = message
|
||||||
|
|
||||||
|
def replace_printed_line_by_uuid(self, uuid, new_message):
|
||||||
|
"""Replace already printed lines that are greyed out with real ones"""
|
||||||
|
lines = self.weechat_buffer.find_lines(
|
||||||
|
partial(self._find_by_uuid_predicate, uuid)
|
||||||
|
)
|
||||||
|
|
||||||
|
new_lines = new_message.formatted_message.to_weechat().split("\n")
|
||||||
|
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
line.message = new_lines[i]
|
||||||
|
tags = line.tags
|
||||||
|
|
||||||
|
new_tags = [
|
||||||
|
tag for tag in tags
|
||||||
|
if not tag.startswith(SCRIPT_NAME + "_uuid_")
|
||||||
|
]
|
||||||
|
new_tags.append(SCRIPT_NAME + "_id_ " + new_message.event_id)
|
||||||
|
line.tags = new_tags
|
||||||
|
|
||||||
def old_redacted(self, event):
|
def old_redacted(self, event):
|
||||||
tags = [
|
tags = [
|
||||||
SCRIPT_NAME + "_message",
|
SCRIPT_NAME + "_message",
|
||||||
|
|
|
@ -453,6 +453,17 @@ class MatrixConfig(WeechatConfig):
|
||||||
("Reconnect to the server if the lag is greater than this "
|
("Reconnect to the server if the lag is greater than this "
|
||||||
"value (in seconds)"),
|
"value (in seconds)"),
|
||||||
),
|
),
|
||||||
|
Option(
|
||||||
|
"print_unconfirmed_messages",
|
||||||
|
"boolean",
|
||||||
|
"",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
"on",
|
||||||
|
("If off, messages are only printed after the server confirms"
|
||||||
|
"their receival. If on, messages are immediately printed but "
|
||||||
|
"colored differently until receival is confirmed."),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
color_options = [
|
color_options = [
|
||||||
|
@ -464,7 +475,28 @@ class MatrixConfig(WeechatConfig):
|
||||||
0,
|
0,
|
||||||
"lightgreen",
|
"lightgreen",
|
||||||
("Color for matrix style blockquotes"),
|
("Color for matrix style blockquotes"),
|
||||||
)
|
),
|
||||||
|
Option(
|
||||||
|
"error_message",
|
||||||
|
"color",
|
||||||
|
"",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
"darkgray",
|
||||||
|
("Color for error messages that appear inside a room buffer ("
|
||||||
|
"e.g. when a message errors out when sending or when a "
|
||||||
|
"message is redacted)"),
|
||||||
|
),
|
||||||
|
Option(
|
||||||
|
"unconfirmed_message",
|
||||||
|
"color",
|
||||||
|
"",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
"darkgray",
|
||||||
|
("Color for messages that are printed out but the server "
|
||||||
|
"hasn't confirmed the that he received them."),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
sections = [
|
sections = [
|
||||||
|
|
|
@ -61,7 +61,7 @@ from .globals import SCRIPT_NAME, SERVERS, W, MAX_EVENTS
|
||||||
from .utf import utf8_decode
|
from .utf import utf8_decode
|
||||||
from .utils import create_server_buffer, key_from_value, server_buffer_prnt
|
from .utils import create_server_buffer, key_from_value, server_buffer_prnt
|
||||||
|
|
||||||
from .colors import Formatted
|
from .colors import Formatted, FormattedString, DEFAULT_ATRIBUTES
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -248,6 +248,7 @@ class MatrixServer(object):
|
||||||
self.device_deletion_queue = dict()
|
self.device_deletion_queue = dict()
|
||||||
|
|
||||||
self.own_message_queue = dict() # type: Dict[str, OwnMessage]
|
self.own_message_queue = dict() # type: Dict[str, OwnMessage]
|
||||||
|
self.print_before_ack_queue = [] # type: List[UUID]
|
||||||
self.encryption_queue = defaultdict(deque) \
|
self.encryption_queue = defaultdict(deque) \
|
||||||
# type: DefaultDict[str, Deque[EncrytpionQueueItem]]
|
# type: DefaultDict[str, Deque[EncrytpionQueueItem]]
|
||||||
self.backlog_queue = dict() # type: Dict[str, str]
|
self.backlog_queue = dict() # type: Dict[str, str]
|
||||||
|
@ -719,11 +720,32 @@ class MatrixServer(object):
|
||||||
message_class = OwnMessage
|
message_class = OwnMessage
|
||||||
|
|
||||||
own_message = message_class(
|
own_message = message_class(
|
||||||
self.user_id, 0, "", room.room_id, formatted
|
self.user_id, 0, "", uuid, room.room_id, formatted
|
||||||
)
|
)
|
||||||
|
|
||||||
self.own_message_queue[uuid] = own_message
|
self.own_message_queue[uuid] = own_message
|
||||||
self.send_or_queue(request)
|
self.send_or_queue(request)
|
||||||
|
|
||||||
|
if G.CONFIG.network.print_unconfirmed_messages:
|
||||||
|
self.print_before_ack_queue.append(uuid)
|
||||||
|
plain_message = formatted.to_weechat()
|
||||||
|
plain_message = W.string_remove_color(plain_message, "")
|
||||||
|
attributes = DEFAULT_ATRIBUTES.copy()
|
||||||
|
attributes["fgcolor"] = G.CONFIG.color.unconfirmed_message
|
||||||
|
new_formatted = Formatted([FormattedString(
|
||||||
|
plain_message,
|
||||||
|
attributes
|
||||||
|
)])
|
||||||
|
|
||||||
|
own_message = message_class(
|
||||||
|
self.user_id, 0, "", uuid, room.room_id, new_formatted
|
||||||
|
)
|
||||||
|
|
||||||
|
if isinstance(own_message, OwnAction):
|
||||||
|
room_buffer.self_action(own_message)
|
||||||
|
elif isinstance(own_message, OwnMessage):
|
||||||
|
room_buffer.self_message(own_message)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def keys_upload(self):
|
def keys_upload(self):
|
||||||
|
@ -758,11 +780,25 @@ class MatrixServer(object):
|
||||||
server_buffer_prnt(self, pprint.pformat(message.request.payload))
|
server_buffer_prnt(self, pprint.pformat(message.request.payload))
|
||||||
server_buffer_prnt(self, pprint.pformat(message.response.body))
|
server_buffer_prnt(self, pprint.pformat(message.response.body))
|
||||||
|
|
||||||
|
def handle_own_messages_error(self, response):
|
||||||
|
message = self.own_message_queue.pop(response.uuid)
|
||||||
|
if response.uuid not in self.print_before_ack_queue:
|
||||||
|
return
|
||||||
|
|
||||||
|
room_buffer = self.room_buffers[message.room_id]
|
||||||
|
room_buffer.mark_message_as_unsent(response.uuid, message)
|
||||||
|
|
||||||
def handle_own_messages(self, response):
|
def handle_own_messages(self, response):
|
||||||
message = self.own_message_queue.pop(response.uuid)
|
message = self.own_message_queue.pop(response.uuid)
|
||||||
room_buffer = self.room_buffers[message.room_id]
|
room_buffer = self.room_buffers[message.room_id]
|
||||||
message = message._replace(event_id=response.event_id)
|
message = message._replace(event_id=response.event_id)
|
||||||
|
|
||||||
|
# We already printed the message, just modify it to contain the proper
|
||||||
|
# colors and formatting.
|
||||||
|
if response.uuid in self.print_before_ack_queue:
|
||||||
|
room_buffer.replace_printed_line_by_uuid(response.uuid, message)
|
||||||
|
return
|
||||||
|
|
||||||
if isinstance(message, OwnAction):
|
if isinstance(message, OwnAction):
|
||||||
room_buffer.self_action(message)
|
room_buffer.self_action(message)
|
||||||
return
|
return
|
||||||
|
@ -990,6 +1026,8 @@ class MatrixServer(object):
|
||||||
elif isinstance(response, JoinedMembersError):
|
elif isinstance(response, JoinedMembersError):
|
||||||
self.rooms_with_missing_members.append(response.room_id)
|
self.rooms_with_missing_members.append(response.room_id)
|
||||||
self.get_joined_members(self.rooms_with_missing_members.pop())
|
self.get_joined_members(self.rooms_with_missing_members.pop())
|
||||||
|
elif isinstance(response, RoomSendResponse):
|
||||||
|
self.handle_own_messages_error(response)
|
||||||
|
|
||||||
def handle_response(self, response):
|
def handle_response(self, response):
|
||||||
# type: (Response) -> None
|
# type: (Response) -> None
|
||||||
|
|
Loading…
Add table
Reference in a new issue