Message sending

This commit is contained in:
Andrew Ferrazzutti 2022-03-09 20:26:39 -05:00
parent 00c0090c19
commit 6e6c6f5c48
3 changed files with 65 additions and 15 deletions

View File

@ -225,6 +225,14 @@ class Client:
sync_from=sync_from.serialize() if sync_from else None sync_from=sync_from.serialize() if sync_from else None
))[-limit if limit else 0:] ))[-limit if limit else 0:]
async def send_message(self, channel_id: Long, text: str) -> Chatlog:
return await self._api_user_request_result(
Chatlog,
"send_message",
channel_id=channel_id.serialize(),
text=text
)
async def stop(self) -> None: async def stop(self) -> None:
# TODO Stop all event handlers # TODO Stop all event handlers
await self._api_user_request_void("stop") await self._api_user_request_void("stop")

View File

@ -19,6 +19,7 @@ from typing import TYPE_CHECKING, Any, AsyncGenerator, Pattern, cast
from collections import deque from collections import deque
import asyncio import asyncio
import re import re
import time
from mautrix.appservice import IntentAPI from mautrix.appservice import IntentAPI
from mautrix.bridge import BasePortal, NotificationDisabler, async_getter_lock from mautrix.bridge import BasePortal, NotificationDisabler, async_getter_lock
@ -45,7 +46,7 @@ from .db import (
Message as DBMessage, Message as DBMessage,
Portal as DBPortal, Portal as DBPortal,
) )
from .formatter.from_kakaotalk import kakaotalk_to_matrix from .formatter import kakaotalk_to_matrix, matrix_to_kakaotalk
from .kt.types.bson import Long, IntLong from .kt.types.bson import Long, IntLong
from .kt.types.channel.channel_info import ChannelInfo from .kt.types.channel.channel_info import ChannelInfo
@ -53,6 +54,7 @@ from .kt.types.channel.channel_type import KnownChannelType, ChannelType
from .kt.types.chat.chat import Chatlog from .kt.types.chat.chat import Chatlog
from .kt.client.types import UserInfoUnion, PortalChannelInfo from .kt.client.types import UserInfoUnion, PortalChannelInfo
from .kt.client.errors import CommandException
if TYPE_CHECKING: if TYPE_CHECKING:
from .__main__ import KakaoTalkBridge from .__main__ import KakaoTalkBridge
@ -649,10 +651,44 @@ class Portal(DBPortal, BasePortal):
else: else:
raise NotImplementedError(f"Unsupported message type {message.msgtype}") raise NotImplementedError(f"Unsupported message type {message.msgtype}")
async def _make_dbm(self, sender: u.User, event_id: EventID, ktid: Long) -> None:
await DBMessage(
mxid=event_id,
mx_room=self.mxid,
ktid=ktid,
index=0,
kt_chat=self.ktid,
kt_receiver=self.kt_receiver,
# TODO?
#kt_sender=sender.ktid,
timestamp=int(time.time() * 1000),
).insert()
async def _handle_matrix_text( async def _handle_matrix_text(
self, event_id: EventID, sender: u.User, message: TextMessageEventContent self, event_id: EventID, sender: u.User, message: TextMessageEventContent
) -> None: ) -> None:
self.log.info("TODO: _handle_matrix_text") converted = await matrix_to_kakaotalk(message, self.mxid, self.log)
try:
chatlog = await sender.client.send_message(
self.ktid,
text=converted.text,
# TODO
#mentions=converted.mentions,
#reply_to=converted.reply_to,
)
except CommandException:
self.log.debug(f"Error handling Matrix message {event_id}")
raise
await self._make_dbm(sender, event_id, chatlog.logId)
self.log.debug(f"Handled Matrix message {event_id} -> {chatlog.logId}")
sender.send_remote_checkpoint(
MessageSendCheckpointStatus.SUCCESS,
event_id,
self.mxid,
EventType.ROOM_MESSAGE,
message.msgtype,
)
async def _handle_matrix_media( async def _handle_matrix_media(
self, event_id: EventID, sender: u.User, message: MediaMessageEventContent, is_relay: bool self, event_id: EventID, sender: u.User, message: MediaMessageEventContent, is_relay: bool

View File

@ -23,6 +23,8 @@ import {
KnownAuthStatusCode, KnownAuthStatusCode,
util, util,
} from "node-kakao" } from "node-kakao"
import chat from "node-kakao/chat"
const { KnownChatType } = chat
/** @typedef {import("node-kakao").OAuthCredential} OAuthCredential */ /** @typedef {import("node-kakao").OAuthCredential} OAuthCredential */
/** @typedef {import("./clientmanager.js").default} ClientManager} */ /** @typedef {import("./clientmanager.js").default} ClientManager} */
@ -341,6 +343,22 @@ export default class PeerClient {
return await talkChannel.getChatListFrom(req.sync_from) return await talkChannel.getChatListFrom(req.sync_from)
} }
/**
* @param {Object} req
* @param {string} req.mxid
* @param {Long} req.channel_id
* @param {string} req.text
*/
sendMessage = async (req) => {
const userClient = this.#getUser(req.mxid)
const talkChannel = userClient.talkClient.channelList.get(req.channel_id)
return await talkChannel.sendChat({
type: KnownChatType.TEXT,
text: req.text,
})
}
/** /**
* @param {Object} req * @param {Object} req
* @param {string} req.mxid * @param {string} req.mxid
@ -434,19 +452,7 @@ export default class PeerClient {
get_portal_channel_info: this.getPortalChannelInfo, get_portal_channel_info: this.getPortalChannelInfo,
get_chats: this.getChats, get_chats: this.getChats,
get_profile: this.getProfile, get_profile: this.getProfile,
/* send_message: this.sendMessage,
send: req => this.puppet.sendMessage(req.chat_id, req.text),
send_file: req => this.puppet.sendFile(req.chat_id, req.file_path),
set_last_message_ids: req => this.puppet.setLastMessageIDs(req.msg_ids, req.own_msg_ids, req.rct_ids),
forget_chat: req => this.puppet.forgetChat(req.chat_id),
pause: () => this.puppet.stopObserving(),
resume: () => this.puppet.startObserving(),
get_contacts: () => this.puppet.getContacts(),
get_chats: () => this.puppet.getRecentChats(),
get_chat: req => this.puppet.getChatInfo(req.chat_id, req.force_view),
get_messages: req => this.puppet.getMessages(req.chat_id),
read_image: req => this.puppet.readImage(req.image_url),
*/
//is_connected: async () => ({ is_connected: !await this.puppet.isDisconnected() }), //is_connected: async () => ({ is_connected: !await this.puppet.isDisconnected() }),
}[req.command] || this.handleUnknownCommand }[req.command] || this.handleUnknownCommand
} }