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)