Handle media messages.
This commit is contained in:
parent
2fc2828dd0
commit
13d70ae867
2 changed files with 108 additions and 15 deletions
|
@ -29,8 +29,9 @@ except ImportError:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from urllib import quote, urlencode
|
from urllib import quote, urlencode
|
||||||
|
from urlparse import urlparse
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from urllib.parse import quote, urlencode
|
from urllib.parse import quote, urlencode, urlparse
|
||||||
|
|
||||||
from matrix.http import RequestType, HttpRequest
|
from matrix.http import RequestType, HttpRequest
|
||||||
import matrix.events as MatrixEvents
|
import matrix.events as MatrixEvents
|
||||||
|
@ -199,6 +200,24 @@ class MatrixClient:
|
||||||
|
|
||||||
return HttpRequest(RequestType.POST, self.host, path, content)
|
return HttpRequest(RequestType.POST, self.host, path, content)
|
||||||
|
|
||||||
|
def mxc_to_http(self, mxc):
|
||||||
|
# type: (str) -> str
|
||||||
|
url = urlparse(mxc)
|
||||||
|
|
||||||
|
if url.scheme != "mxc":
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not url.netloc or not url.path:
|
||||||
|
return None
|
||||||
|
|
||||||
|
http_url = ("https://{host}/_matrix/media/r0/download/"
|
||||||
|
"{server_name}{mediaId}").format(
|
||||||
|
host=self.host,
|
||||||
|
server_name=url.netloc,
|
||||||
|
mediaId=url.path)
|
||||||
|
|
||||||
|
return http_url
|
||||||
|
|
||||||
|
|
||||||
class MatrixMessage():
|
class MatrixMessage():
|
||||||
|
|
||||||
|
|
|
@ -248,6 +248,61 @@ class RoomRedactedMessageEvent(RoomEvent):
|
||||||
|
|
||||||
class RoomMessageEvent(RoomEvent):
|
class RoomMessageEvent(RoomEvent):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, event):
|
||||||
|
if event['content']['msgtype'] == 'm.text':
|
||||||
|
return RoomMessageText.from_dict(event)
|
||||||
|
elif event['content']['msgtype'] == 'm.image':
|
||||||
|
return RoomMessageMedia.from_dict(event)
|
||||||
|
elif event['content']['msgtype'] == 'm.audio':
|
||||||
|
return RoomMessageMedia.from_dict(event)
|
||||||
|
elif event['content']['msgtype'] == 'm.file':
|
||||||
|
return RoomMessageMedia.from_dict(event)
|
||||||
|
elif event['content']['msgtype'] == 'm.video':
|
||||||
|
return RoomMessageMedia.from_dict(event)
|
||||||
|
return RoomMessageUnknown.from_dict(event)
|
||||||
|
|
||||||
|
def _print_message(self, message, room, buff, tags):
|
||||||
|
nick, color_name = sender_to_nick_and_color(room, self.sender)
|
||||||
|
color = color_for_tags(color_name)
|
||||||
|
|
||||||
|
event_tags = add_event_tags(self.event_id, nick, color, tags)
|
||||||
|
|
||||||
|
tags_string = ",".join(event_tags)
|
||||||
|
|
||||||
|
data = "{author}\t{msg}".format(author=nick, msg=message)
|
||||||
|
|
||||||
|
date = date_from_age(self.age)
|
||||||
|
W.prnt_date_tags(buff, date, tags_string, data)
|
||||||
|
|
||||||
|
|
||||||
|
class RoomMessageUnknown(RoomMessageEvent):
|
||||||
|
|
||||||
|
def __init__(self, event_id, sender, age, message_type, body):
|
||||||
|
self.message_type = message_type
|
||||||
|
self.body = body
|
||||||
|
RoomEvent.__init__(self, event_id, sender, age)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, event):
|
||||||
|
event_id = sanitize_id(event["event_id"])
|
||||||
|
sender = sanitize_id(event["sender"])
|
||||||
|
age = sanitize_age(event["unsigned"]["age"])
|
||||||
|
|
||||||
|
body = sanitize_text(event["content"]["body"])
|
||||||
|
message_type = sanitize_text(event["content"]["msgtype"])
|
||||||
|
|
||||||
|
return cls(event_id, sender, age, message_type, body)
|
||||||
|
|
||||||
|
def execute(self, server, room, buff, tags):
|
||||||
|
msg = ("Unknown message of type {t}, body: {body}").format(
|
||||||
|
t=self.message_type, body=self.body)
|
||||||
|
|
||||||
|
self._print_message(msg, room, buff, tags)
|
||||||
|
|
||||||
|
|
||||||
|
class RoomMessageText(RoomMessageEvent):
|
||||||
|
|
||||||
def __init__(self, event_id, sender, age, message, formatted_message=None):
|
def __init__(self, event_id, sender, age, message, formatted_message=None):
|
||||||
self.message = message
|
self.message = message
|
||||||
self.formatted_message = formatted_message
|
self.formatted_message = formatted_message
|
||||||
|
@ -262,7 +317,6 @@ class RoomMessageEvent(RoomEvent):
|
||||||
msg = ""
|
msg = ""
|
||||||
formatted_msg = None
|
formatted_msg = None
|
||||||
|
|
||||||
if event['content']['msgtype'] == 'm.text':
|
|
||||||
msg = sanitize_text(event['content']['body'])
|
msg = sanitize_text(event['content']['body'])
|
||||||
|
|
||||||
if ('format' in event['content'] and
|
if ('format' in event['content'] and
|
||||||
|
@ -277,17 +331,37 @@ class RoomMessageEvent(RoomEvent):
|
||||||
msg = (self.formatted_message.to_weechat()
|
msg = (self.formatted_message.to_weechat()
|
||||||
if self.formatted_message else self.message)
|
if self.formatted_message else self.message)
|
||||||
|
|
||||||
nick, color_name = sender_to_nick_and_color(room, self.sender)
|
self._print_message(msg, room, buff, tags)
|
||||||
color = color_for_tags(color_name)
|
|
||||||
|
|
||||||
event_tags = add_event_tags(self.event_id, nick, color, tags)
|
|
||||||
|
|
||||||
tags_string = ",".join(event_tags)
|
class RoomMessageMedia(RoomMessageEvent):
|
||||||
|
|
||||||
data = "{author}\t{msg}".format(author=nick, msg=msg)
|
def __init__(self, event_id, sender, age, url, description):
|
||||||
|
self.url = url
|
||||||
|
self.description = description
|
||||||
|
RoomEvent.__init__(self, event_id, sender, age)
|
||||||
|
|
||||||
date = date_from_age(self.age)
|
@classmethod
|
||||||
W.prnt_date_tags(buff, date, tags_string, data)
|
def from_dict(cls, event):
|
||||||
|
event_id = sanitize_id(event["event_id"])
|
||||||
|
sender = sanitize_id(event["sender"])
|
||||||
|
age = sanitize_age(event["unsigned"]["age"])
|
||||||
|
|
||||||
|
mxc_url = sanitize_text(event['content']['url'])
|
||||||
|
description = sanitize_text(event["content"]["body"])
|
||||||
|
|
||||||
|
return cls(event_id, sender, age, mxc_url, description)
|
||||||
|
|
||||||
|
def execute(self, server, room, buff, tags):
|
||||||
|
http_url = server.client.mxc_to_http(self.url)
|
||||||
|
url = http_url if http_url else self.url
|
||||||
|
|
||||||
|
description = (" ({})".format(self.description)
|
||||||
|
if self.description else "")
|
||||||
|
|
||||||
|
msg = "{url}{desc}".format(url=url, desc=description)
|
||||||
|
|
||||||
|
self._print_message(msg, room, buff, tags)
|
||||||
|
|
||||||
|
|
||||||
class RoomMemberJoin(RoomEvent):
|
class RoomMemberJoin(RoomEvent):
|
||||||
|
|
Loading…
Add table
Reference in a new issue