rooms: Handle invites.
This commit is contained in:
parent
ca9b60cd34
commit
3c4888c1fb
3 changed files with 87 additions and 15 deletions
|
@ -385,8 +385,9 @@ class WeechatChannelBuffer(object):
|
||||||
message = self._membership_message(user, "join")
|
message = self._membership_message(user, "join")
|
||||||
self.print_date_tags(message, date, tags)
|
self.print_date_tags(message, date, tags)
|
||||||
|
|
||||||
def invite(self, user, date, extra_tags=[]):
|
def invite(self, nick, date, extra_tags=[]):
|
||||||
# type: (WeechatUser, int, Optional[bool], Optional[List[str]]) -> None
|
# type: (str, int, Optional[bool], Optional[List[str]]) -> None
|
||||||
|
user = self._get_user(nick)
|
||||||
tags = self._message_tags(user, "invite")
|
tags = self._message_tags(user, "invite")
|
||||||
message = self._membership_message(user, "invite")
|
message = self._membership_message(user, "invite")
|
||||||
self.print_date_tags(message, date, tags + extra_tags)
|
self.print_date_tags(message, date, tags + extra_tags)
|
||||||
|
|
|
@ -208,6 +208,9 @@ class RoomInfo():
|
||||||
elif event_dict["content"]["membership"] == "leave":
|
elif event_dict["content"]["membership"] == "leave":
|
||||||
return RoomMemberLeave.from_dict(event_dict)
|
return RoomMemberLeave.from_dict(event_dict)
|
||||||
|
|
||||||
|
elif event_dict["content"]["membership"] == "invite":
|
||||||
|
return RoomMemberInvite.from_dict(event_dict)
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -308,6 +311,10 @@ class RoomEvent():
|
||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
|
|
||||||
|
|
||||||
|
class RoomMembershipEvent(RoomEvent):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class RoomRedactedMessageEvent(RoomEvent):
|
class RoomRedactedMessageEvent(RoomEvent):
|
||||||
|
|
||||||
def __init__(self, event_id, sender, timestamp, censor, reason=None):
|
def __init__(self, event_id, sender, timestamp, censor, reason=None):
|
||||||
|
@ -527,11 +534,22 @@ class RoomMessageMedia(RoomMessageEvent):
|
||||||
self._print_message(msg, room, buff, tags)
|
self._print_message(msg, room, buff, tags)
|
||||||
|
|
||||||
|
|
||||||
class RoomMemberJoin(RoomEvent):
|
class RoomMemberJoin(RoomMembershipEvent):
|
||||||
|
|
||||||
def __init__(self, event_id, sender, timestamp, display_name, state_key):
|
def __init__(
|
||||||
|
self,
|
||||||
|
event_id,
|
||||||
|
sender,
|
||||||
|
timestamp,
|
||||||
|
display_name,
|
||||||
|
state_key,
|
||||||
|
content,
|
||||||
|
prev_content
|
||||||
|
):
|
||||||
self.display_name = display_name
|
self.display_name = display_name
|
||||||
self.state_key = state_key
|
self.state_key = state_key
|
||||||
|
self.content = content
|
||||||
|
self.prev_content = prev_content
|
||||||
RoomEvent.__init__(self, event_id, sender, timestamp)
|
RoomEvent.__init__(self, event_id, sender, timestamp)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -541,16 +559,42 @@ class RoomMemberJoin(RoomEvent):
|
||||||
timestamp = sanitize_ts(event_dict["origin_server_ts"])
|
timestamp = sanitize_ts(event_dict["origin_server_ts"])
|
||||||
state_key = sanitize_id(event_dict["state_key"])
|
state_key = sanitize_id(event_dict["state_key"])
|
||||||
display_name = None
|
display_name = None
|
||||||
|
content = event_dict["content"]
|
||||||
|
prev_content = (event_dict["unsigned"]["prev_content"]
|
||||||
|
if "prev_content" in event_dict["unsigned"] else None)
|
||||||
|
|
||||||
if event_dict["content"]:
|
if event_dict["content"]:
|
||||||
if "display_name" in event_dict["content"]:
|
if "display_name" in event_dict["content"]:
|
||||||
display_name = sanitize_text(
|
display_name = sanitize_text(
|
||||||
event_dict["content"]["displayname"])
|
event_dict["content"]["displayname"])
|
||||||
|
|
||||||
return cls(event_id, sender, timestamp, display_name, state_key)
|
return cls(
|
||||||
|
event_id,
|
||||||
|
sender,
|
||||||
|
timestamp,
|
||||||
|
display_name,
|
||||||
|
state_key,
|
||||||
|
content,
|
||||||
|
prev_content
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class RoomMemberLeave(RoomEvent):
|
class RoomMemberInvite(RoomMembershipEvent):
|
||||||
|
def __init__(self, event_id, sender, invited_user, timestamp):
|
||||||
|
self.invited_user = invited_user
|
||||||
|
RoomEvent.__init__(self, event_id, sender, timestamp)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, event_dict):
|
||||||
|
event_id = sanitize_id(event_dict["event_id"])
|
||||||
|
sender = sanitize_id(event_dict["sender"])
|
||||||
|
invited_user = sanitize_id(event_dict["state_key"])
|
||||||
|
timestamp = sanitize_ts(event_dict["origin_server_ts"])
|
||||||
|
|
||||||
|
return cls(event_id, sender, invited_user, timestamp)
|
||||||
|
|
||||||
|
|
||||||
|
class RoomMemberLeave(RoomMembershipEvent):
|
||||||
|
|
||||||
def __init__(self, event_id, sender, leaving_user, timestamp):
|
def __init__(self, event_id, sender, leaving_user, timestamp):
|
||||||
self.leaving_user = leaving_user
|
self.leaving_user = leaving_user
|
||||||
|
|
|
@ -40,8 +40,10 @@ from .rooms import (
|
||||||
RoomMessageText,
|
RoomMessageText,
|
||||||
RoomMessageEmote,
|
RoomMessageEmote,
|
||||||
MatrixUser,
|
MatrixUser,
|
||||||
|
RoomMembershipEvent,
|
||||||
RoomMemberJoin,
|
RoomMemberJoin,
|
||||||
RoomMemberLeave,
|
RoomMemberLeave,
|
||||||
|
RoomMemberInvite,
|
||||||
RoomTopicEvent
|
RoomTopicEvent
|
||||||
)
|
)
|
||||||
from matrix.api import (
|
from matrix.api import (
|
||||||
|
@ -638,7 +640,7 @@ class MatrixServer:
|
||||||
event,
|
event,
|
||||||
is_state_event
|
is_state_event
|
||||||
):
|
):
|
||||||
if isinstance(event, RoomMemberJoin):
|
def join(event, date, room, room_buffer, is_state_event):
|
||||||
room.handle_event(event)
|
room.handle_event(event)
|
||||||
user = room.users[event.sender]
|
user = room.users[event.sender]
|
||||||
buffer_user = RoomUser(user.name, event.sender)
|
buffer_user = RoomUser(user.name, event.sender)
|
||||||
|
@ -655,14 +657,39 @@ class MatrixServer:
|
||||||
not is_state_event
|
not is_state_event
|
||||||
)
|
)
|
||||||
|
|
||||||
elif isinstance(event, RoomMemberLeave):
|
date = server_ts_to_weechat(event.timestamp)
|
||||||
user = room.users[event.sender]
|
|
||||||
date = server_ts_to_weechat(event.timestamp)
|
|
||||||
|
|
||||||
if event.sender == event.leaving_user:
|
joined = False
|
||||||
room_buffer.part(user.name, date, not is_state_event)
|
left = False
|
||||||
|
|
||||||
|
if isinstance(event, RoomMemberJoin):
|
||||||
|
if event.prev_content and "membership" in event.prev_content:
|
||||||
|
if (event.prev_content["membership"] == "leave"
|
||||||
|
or event.prev_content["membership"] == "invite"):
|
||||||
|
join(event, date, room, room_buffer, is_state_event)
|
||||||
|
joined = True
|
||||||
|
else:
|
||||||
|
# TODO print out profile changes
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
room_buffer.kick(user.name, date, not is_state_event)
|
# No previous content for this user in this room, so he just
|
||||||
|
# joined.
|
||||||
|
join(event, date, room, room_buffer, is_state_event)
|
||||||
|
joined = True
|
||||||
|
|
||||||
|
elif isinstance(event, RoomMemberLeave):
|
||||||
|
# TODO the nick can be a display name or a full sender name
|
||||||
|
nick = shorten_sender(event.sender)
|
||||||
|
if event.sender == event.leaving_user:
|
||||||
|
room_buffer.part(nick, date, not is_state_event)
|
||||||
|
else:
|
||||||
|
room_buffer.kick(nick, date, not is_state_event)
|
||||||
|
|
||||||
|
left = True
|
||||||
|
|
||||||
|
elif isinstance(event, RoomMemberInvite):
|
||||||
|
room_buffer.invite(event.sender, date)
|
||||||
|
return
|
||||||
|
|
||||||
# calculate room display name and set it as the buffer list name
|
# calculate room display name and set it as the buffer list name
|
||||||
room_name = room.display_name(self.user_id)
|
room_name = room.display_name(self.user_id)
|
||||||
|
@ -670,11 +697,11 @@ class MatrixServer:
|
||||||
|
|
||||||
# A user has joined or left an encrypted room, we need to check for
|
# A user has joined or left an encrypted room, we need to check for
|
||||||
# new devices and create a new group session
|
# new devices and create a new group session
|
||||||
if room.encrypted:
|
if room.encrypted and (joined or left):
|
||||||
self.device_check_timestamp = None
|
self.device_check_timestamp = None
|
||||||
|
|
||||||
def handle_room_event(self, room, room_buffer, event, is_state_event):
|
def handle_room_event(self, room, room_buffer, event, is_state_event):
|
||||||
if isinstance(event, (RoomMemberJoin, RoomMemberLeave)):
|
if isinstance(event, RoomMembershipEvent):
|
||||||
self.handle_room_membership_events(
|
self.handle_room_membership_events(
|
||||||
room,
|
room,
|
||||||
room_buffer,
|
room_buffer,
|
||||||
|
|
Loading…
Reference in a new issue