From 24b412d73c16adbd7fc04f3a316931808bd071fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?poljar=20=28Damir=20Jeli=C4=87=29?= <poljar@termina.org.uk> Date: Thu, 5 Jul 2018 15:46:45 +0200 Subject: [PATCH] matrix: Change the way the topic is changed. --- matrix/buffer.py | 19 +++++++++-- matrix/rooms.py | 85 ------------------------------------------------ matrix/server.py | 47 ++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 90 deletions(-) diff --git a/matrix/buffer.py b/matrix/buffer.py index 447235c..e08d038 100644 --- a/matrix/buffer.py +++ b/matrix/buffer.py @@ -139,7 +139,6 @@ class WeechatChannelBuffer(object): self.name = "" self.users = {} # type: Dict[str, RoomUser] - self.topic = "" self.topic_author = "" self.topic_date = None @@ -425,15 +424,21 @@ class WeechatChannelBuffer(object): nick=user.nick, chan_color=W.color("chat_channel"), ncolor=W.color("reset"), - room=self.name, + room=self.short_name, topic=topic ) self.print_date_tags(data, date, tags) - def topic(self, nick, topic, date, message=True): + @property + def topic(self): + return W.buffer_get_string(self._ptr, "title") + + @topic.setter + def topic(self, topic): W.buffer_set(self._ptr, "title", topic) + def change_topic(self, nick, topic, date, message=True): if message: self._print_topic(nick, topic, date) @@ -451,3 +456,11 @@ class WeechatChannelBuffer(object): tags = self._message_tags(user, "self_message") tags.append(SCRIPT_NAME + "_action") self.action(nick, message, date, tags) + + @property + def short_name(self): + return W.buffer_get_string(self._ptr, "short_name") + + @short_name.setter + def short_name(self, name): + W.buffer_set(self._ptr, "short_name", name) diff --git a/matrix/rooms.py b/matrix/rooms.py index 434f943..4900ccf 100644 --- a/matrix/rooms.py +++ b/matrix/rooms.py @@ -566,44 +566,6 @@ class RoomMemberJoin(RoomEvent): return cls(event_id, sender, timestamp, display_name) - def execute(self, server, room, buff, tags): - short_name = shorten_sender(self.sender) - - if self.sender in room.users: - user = room.users[self.sender] - if self.display_name: - user.display_name = self.display_name - else: - user = MatrixUser(short_name, self.display_name) - - if not user.nick_color: - if self.sender == server.user_id: - highlight_words = [self.sender, user.name] - - if self.display_name: - highlight_words.append(self.display_name) - - user.nick_color = "weechat.color.chat_nick_self" - W.buffer_set(buff, "highlight_words", ",".join(highlight_words)) - else: - user.nick_color = W.info_get("nick_color_name", user.name) - - room.users[self.sender] = user - - nick_pointer = W.nicklist_search_nick(buff, "", self.sender) - - if not nick_pointer: - add_user_to_nicklist(buff, self.sender, user) - - # calculate room display name and set it as the buffer list name - room_name = room.display_name(server.user_id) - - # A user has joined an encrypted room, we need to check for new devices - if room.encrypted: - server.device_check_timestamp = None - - W.buffer_set(buff, "short_name", room_name) - class RoomMemberLeave(RoomEvent): @@ -675,43 +637,6 @@ class RoomPowerLevels(RoomEvent): self._set_power_level(room, buff, level) -class RoomTopiceMessage(RoomEvent): - - def __init__(self, event_id, sender, timestamp, topic): - self.topic = topic - RoomEvent.__init__(self, event_id, sender, timestamp) - - def execute(self, server, room, buff, tags): - topic = self.topic - - nick, color_name = sender_to_nick_and_color(room, self.sender) - - author = ("{nick_color}{user}{ncolor}").format( - nick_color=W.color(color_name), user=nick, ncolor=W.color("reset")) - - # TODO print old topic if configured so - if room.is_named(): - message = ("{prefix}{nick} has changed " - "the topic for {chan_color}{room}{ncolor} " - "to \"{topic}\"").format( - prefix=W.prefix("network"), - nick=author, - chan_color=W.color("chat_channel"), - ncolor=W.color("reset"), - room=room.named_room_name(), - topic=topic) - else: - message = ('{prefix}{nick} has changed the topic to ' - '"{topic}"').format( - prefix=W.prefix("network"), - nick=author, - topic=topic) - - tags = ["matrix_topic", "log3", "matrix_id_{}".format(self.event_id)] - date = server_ts_to_weechat(self.timestamp) - W.prnt_date_tags(buff, date, ",".join(tags), message) - - class RoomTopicEvent(RoomEvent): def __init__(self, event_id, sender, timestamp, topic): @@ -728,16 +653,6 @@ class RoomTopicEvent(RoomEvent): return cls(event_id, sender, timestamp, topic) - def execute(self, server, room, buff, tags): - topic = self.topic - - W.buffer_set(buff, "title", topic) - - room.topic = topic - room.topic_author = self.sender - room.topic_date = datetime.fromtimestamp( - server_ts_to_weechat(self.timestamp)) - class RoomRedactionEvent(RoomEvent): diff --git a/matrix/server.py b/matrix/server.py index 0af619d..2cff3ce 100644 --- a/matrix/server.py +++ b/matrix/server.py @@ -40,7 +40,9 @@ from .rooms import ( RoomMessageText, RoomMessageEmote, MatrixUser, - RoomMemberJoin + RoomMemberJoin, + RoomMemberLeave, + RoomTopicEvent ) from matrix.api import ( MatrixClient, @@ -629,7 +631,13 @@ class MatrixServer: server_buffer_prnt(self, pprint.pformat(message.request.payload)) server_buffer_prnt(self, pprint.pformat(message.response.body)) - def handle_room_event(self, room, room_buffer, event, is_state_event): + def handle_room_membership_events( + self, + room, + room_buffer, + event, + is_state_event + ): if isinstance(event, RoomMemberJoin): if event.sender in room.users: user = room.users[event.sender] @@ -639,6 +647,8 @@ class MatrixServer: short_name = shorten_sender(event.sender) user = MatrixUser(short_name, event.display_name) buffer_user = RoomUser(user.name, event.sender) + # TODO remove this duplication + user.nick_color = buffer_user.color room.users[event.sender] = user if self.user_id == event.sender: @@ -650,6 +660,39 @@ class MatrixServer: server_ts_to_weechat(event.timestamp), not is_state_event ) + + # calculate room display name and set it as the buffer list name + room_name = room.display_name(self.user_id) + room_buffer.short_name = room_name + + # A user has joined an encrypted room, we need to check for + # new devices + if room.encrypted: + self.device_check_timestamp = None + elif isinstance(event, RoomMemberLeave): + pass + + def handle_room_event(self, room, room_buffer, event, is_state_event): + if isinstance(event, (RoomMemberJoin, RoomMemberLeave)): + self.handle_room_membership_events( + room, + room_buffer, + event, + is_state_event + ) + elif isinstance(event, RoomTopicEvent): + try: + user = room.users[event.sender] + nick = user.name + except KeyError: + nick = event.sender + + room_buffer.change_topic( + nick, + event.topic, + server_ts_to_weechat(event.timestamp), + not is_state_event + ) else: tags = tags_for_message("message") event.execute(self, room, room_buffer._ptr, tags)