add /react

This commit is contained in:
Tim Clifford 2023-11-04 23:31:59 +00:00 committed by Maze
parent 7d6fba5ac7
commit 022df56c9e

View File

@ -151,7 +151,6 @@ class MatrixClient(nio.AsyncClient):
"m.call.*", "m.call.*",
"m.room.third_party_invite", "m.room.third_party_invite",
"m.room.tombstone", "m.room.tombstone",
"m.reaction",
], ],
}, },
}, },
@ -183,6 +182,7 @@ class MatrixClient(nio.AsyncClient):
# handlers in the user config # handlers in the user config
self.cmd_handler_map = { self.cmd_handler_map = {
"me ": MatrixClient.handle_cmd_emote, "me ": MatrixClient.handle_cmd_emote,
"react ": MatrixClient.handle_cmd_react,
} }
try: try:
@ -748,6 +748,55 @@ class MatrixClient(nio.AsyncClient):
) )
async def handle_cmd_react(
self,
room_id: str,
text: str,
display_name_mentions: Optional[Dict[str, str]] = None, # {id: name}
reply_to_event_id: Optional[str] = None,
) -> None:
if reply_to_event_id is None or reply_to_event_id == '':
await self.send_fake_notice(room_id, "please reply to a message to react to it 🙃")
else:
reaction = emoji.emojize(text, language="alias")
await self.send_reaction(room_id, reaction, reply_to_event_id)
async def send_reaction(
self,
room_id: str,
key: str,
reacts_to: str,
) -> None:
# local event id in model isn't necessarily the actual event id
reacts_to_event_id = self.models[self.user_id, room_id, "events"][reacts_to].event_id
item_uuid = uuid4()
content: Dict[str, Any] = {
"m.relates_to": {
"rel_type": "m.annotation",
"event_id": reacts_to_event_id,
"key": key,
},
}
tx_id = uuid4()
content[f"{__reverse_dns__}.transaction_id"] = str(tx_id)
await self.pause_while_offline()
await self._send_message(room_id, content, item_uuid, message_type = "m.reaction")
# only update the UI after the reaction is sent, to not be misleading
await self._register_reaction(
self.all_rooms[room_id],
reacts_to_event_id,
key,
self.user_id,
)
async def toggle_pause_transfer( async def toggle_pause_transfer(
self, room_id: str, uuid: Union[str, UUID], self, room_id: str, uuid: Union[str, UUID],
) -> None: ) -> None:
@ -1130,7 +1179,7 @@ class MatrixClient(nio.AsyncClient):
async def _send_message( async def _send_message(
self, room_id: str, content: dict, transaction_id: UUID, self, room_id: str, content: dict, transaction_id: UUID, message_type: str = "m.room.message",
) -> None: ) -> None:
"""Send a message event with `content` dict to a room.""" """Send a message event with `content` dict to a room."""
@ -1140,7 +1189,7 @@ class MatrixClient(nio.AsyncClient):
async with self.backend.send_locks[room_id]: async with self.backend.send_locks[room_id]:
await self.room_send( await self.room_send(
room_id = room_id, room_id = room_id,
message_type = "m.room.message", message_type = message_type,
content = content, content = content,
ignore_unverified_devices = True, ignore_unverified_devices = True,
) )
@ -2493,13 +2542,23 @@ class MatrixClient(nio.AsyncClient):
self, self,
room: nio.MatrixRoom, room: nio.MatrixRoom,
ev: nio.ReactionEvent, ev: nio.ReactionEvent,
event_id: str = "", event_id: str = "",
**fields, **fields,
) -> Event: ) -> None:
await self._register_reaction(room, ev.reacts_to, ev.key, ev.sender)
await self.register_nio_event(
room, ev, event_id, type_specifier=TypeSpecifier.Reaction,
content=ev.key, hidden=True, **fields,
)
async def _register_reaction(
self,
room: nio.MatrixRoom,
reacts_to: str,
key: str,
sender: str,
) -> None:
"""Register/update a reaction.""" """Register/update a reaction."""
reacts_to = ev.reacts_to
key = ev.key
sender = ev.sender
model = self.models[self.user_id, room.room_id, "events"] model = self.models[self.user_id, room.room_id, "events"]
reacts_to_event = model.get(reacts_to) reacts_to_event = model.get(reacts_to)
@ -2512,7 +2571,7 @@ class MatrixClient(nio.AsyncClient):
if reacts_to_event: if reacts_to_event:
reactions = reacts_to_event.reactions reactions = reacts_to_event.reactions
if key not in reactions: if key not in reactions:
reactions[key] = {"hint": emoji.demojize(key), "users": []} reactions[key] = {"hint": emoji.demojize(key, language="alias"), "users": []}
if sender not in reactions[key]["users"]: if sender not in reactions[key]["users"]:
reactions[key]["users"].append(sender) reactions[key]["users"].append(sender)
reacts_to_event.set_fields(reactions=reactions) reacts_to_event.set_fields(reactions=reactions)
@ -2528,12 +2587,6 @@ class MatrixClient(nio.AsyncClient):
if sender not in registry[reacts_to][key]: if sender not in registry[reacts_to][key]:
registry[reacts_to][key].append(sender) registry[reacts_to][key].append(sender)
await self.register_nio_event(
room, ev, event_id, type_specifier=TypeSpecifier.Reaction,
content=key, hidden=True, **fields,
)
async def register_message_replacement( async def register_message_replacement(
self, self,
room: nio.MatrixRoom, room: nio.MatrixRoom,