Skip to content

Commit

Permalink
Add Matrix->Hangouts image bridging
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed May 11, 2019
1 parent 2634f5d commit f7b0dbe
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 33 deletions.
3 changes: 1 addition & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* [ ] Files
* [ ] Voice messages
* [ ] Videos
* [ ] Images
* [x] Images
* [ ] Locations
* [ ] Formatting
* [ ] Presence
Expand All @@ -26,7 +26,6 @@
* [x] Text
* [ ] Media
* [ ] Files
* [ ] Voice messages
* [ ] Videos
* [ ] Images
* [ ] Locations
Expand Down
26 changes: 17 additions & 9 deletions mautrix_hangouts/portal.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from collections import deque
import asyncio
import logging
import io

from hangups import hangouts_pb2 as hangouts, ChatMessageEvent
from hangups.user import User as HangoutsUser
Expand Down Expand Up @@ -285,8 +286,8 @@ async def handle_matrix_message(self, sender: 'u.User', message: MessageEventCon
gid = await self._handle_matrix_text(sender, message)
elif message.msgtype == MessageType.EMOTE:
gid = await self._handle_matrix_emote(sender, message)
# elif message.msgtype == MessageType.IMAGE:
# gid = await self._handle_matrix_image(sender, message)
elif message.msgtype == MessageType.IMAGE:
gid = await self._handle_matrix_image(sender, message)
# elif message.msgtype == MessageType.LOCATION:
# gid = await self._handle_matrix_location(sender, message)
else:
Expand All @@ -304,11 +305,12 @@ async def _handle_matrix_text(self, sender: 'u.User', message: TextMessageEventC
async def _handle_matrix_emote(self, sender: 'u.User', message: TextMessageEventContent) -> str:
return await sender.send_emote(self.gid, message.body)

# async def _handle_matrix_image(self, sender: 'u.User',
# message: MediaMessageEventContent) -> str:
# pass
# data = await self.main_intent.download_media(message.url)
# mime = message.info.mimetype or magic.from_buffer(data, mime=True)
async def _handle_matrix_image(self, sender: 'u.User',
message: MediaMessageEventContent) -> str:
data = await self.main_intent.download_media(message.url)
image = await sender.client.upload_image(io.BytesIO(data), filename=message.body)
return await sender.send_image(self.gid, image)

#
# async def _handle_matrix_location(self, sender: 'u.User',
# message: LocationMessageEventContent) -> str:
Expand Down Expand Up @@ -339,8 +341,8 @@ async def handle_hangouts_message(self, source: 'u.User', sender: 'p.Puppet',
if self.invite_own_puppet_to_pm:
await self.main_intent.invite_user(self.mxid, sender.mxid)
elif self.az.state_store.get_membership(self.mxid, sender.mxid) != Membership.JOIN:
self.log.warn(f"Ignoring own message {event.id_} in private chat because own"
" puppet is not in room.")
self.log.debug(f"Ignoring own message {event.id_} in private chat because own"
" puppet is not in room.")
return
async with self.optional_send_lock(sender.gid):
if event.id_ in self._dedup:
Expand All @@ -349,9 +351,15 @@ async def handle_hangouts_message(self, source: 'u.User', sender: 'p.Puppet',
if not self.mxid:
await self.create_matrix_room(source)
intent = sender.intent_for(self)
self.log.debug(f"Attachments: {event.attachments}")
event_id = await intent.send_text(self.mxid, event.text)
DBMessage(mxid=event_id, mx_room=self.mxid, gid=event.id_).insert()

async def handle_hangouts_typing(self, source: 'u.User', sender: 'p.Puppet', status: int
) -> None:
await sender.intent_for(self).set_typing(self.mxid, status == hangouts.TYPING_TYPE_STARTED,
timeout=6000)

# endregion
# region Getters

Expand Down
58 changes: 36 additions & 22 deletions mautrix_hangouts/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@
import time

import hangups
from hangups import Client, UserList, RefreshTokenCache, ConversationEvent, ChatMessageEvent, \
MembershipChangeEvent
from hangups import (hangouts_pb2 as hangouts,
Client, UserList, RefreshTokenCache, ConversationEvent, ChatMessageEvent,
MembershipChangeEvent)
from hangups.conversation import ConversationList, Conversation
from hangups.parsers import TypingStatusMessage
from hangups import hangouts_pb2 as hangouts
from hangups.client import UploadedImage

from mautrix.types import UserID
from mautrix.appservice import AppService
Expand Down Expand Up @@ -224,46 +225,59 @@ async def on_event(self, event: ConversationEvent) -> None:
async def on_typing(self, event: TypingStatusMessage):
portal = po.Portal.get_by_gid(event.conv_id)
if not portal:
return False
self.log.info(
f"{event.user_id} is typing({event.status}) in {event.conv_id} at {event.timestamp}")
return
sender = pu.Puppet.get_by_gid(event.user_id.gaia_id, create=False)
if not sender:
return
await portal.handle_hangouts_typing(self, sender, event.status)

# endregion
# region Hangouts API calls

async def set_typing(self, conversation_id: str, typing: bool) -> None:
self.log.debug(f"set_typing({conversation_id}, {typing})")
await self.client.set_typing(hangouts.SetTypingRequest(
request_header=self.client.get_request_header(),
conversation_id=hangouts.ConversationId(id=conversation_id),
type=hangouts.TYPING_TYPE_STARTED if typing else hangouts.TYPING_TYPE_STOPPED,
))

def _get_event_request_header(self, conversation_id: str) -> hangouts.EventRequestHeader:
return hangouts.EventRequestHeader(
conversation_id=hangouts.ConversationId(
id=conversation_id,
),
client_generated_id=self.client.get_client_generated_id(),
)

async def send_emote(self, conversation_id: str, text: str) -> str:
resp = await self.client.send_chat_message(hangouts.SendChatMessageRequest(
request_header=self.client.get_request_header(),
annotation=[hangouts.EventAnnotation(type=4)],
event_request_header=hangouts.EventRequestHeader(
conversation_id=hangouts.ConversationId(
id=conversation_id,
),
client_generated_id=self.client.get_client_generated_id(),
),
event_request_header=self._get_event_request_header(conversation_id),
message_content=hangouts.MessageContent(
segment=[hangups.ChatMessageSegment(text).serialize()]
)
segment=[hangups.ChatMessageSegment(text).serialize()],
),
))
return resp.created_event.event_id

async def send_text(self, conversation_id: str, text: str) -> str:
resp = await self.client.send_chat_message(hangouts.SendChatMessageRequest(
event_request_header=hangouts.EventRequestHeader(
conversation_id=hangouts.ConversationId(
id=conversation_id,
),
client_generated_id=self.client.get_client_generated_id(),
),
request_header=self.client.get_request_header(),
event_request_header=self._get_event_request_header(conversation_id),
message_content=hangouts.MessageContent(
segment=[hangups.ChatMessageSegment(text).serialize()]
)
segment=[hangups.ChatMessageSegment(text).serialize()],
),
))
return resp.created_event.event_id

async def send_image(self, conversation_id: str, id: str) -> str:
resp = await self.client.send_chat_message(hangouts.SendChatMessageRequest(
request_header=self.client.get_request_header(),
event_request_header=self._get_event_request_header(conversation_id),
existing_media=hangouts.ExistingMedia(
photo=hangouts.Photo(photo_id=id),
),
))
return resp.created_event.event_id

Expand Down

0 comments on commit f7b0dbe

Please sign in to comment.