Merge branch 'feat/enable-replies'

This commit is contained in:
Damir Jelić 2020-05-13 17:06:54 +02:00
commit 06d04b5152
4 changed files with 107 additions and 17 deletions

View file

@ -1,21 +1,26 @@
language: python
dist: xenial
sudo: false
---
## Machine config
os: "linux"
arch: "amd64"
dist: "bionic"
version: "~> 1.0"
## Language config
language: "python"
python:
- "3.6"
- "3.7"
- "3.8"
- "3.6"
- "3.7"
- "3.8"
before_install:
- wget https://gitlab.matrix.org/matrix-org/olm/-/archive/master/olm-master.tar.bz2
- tar -xvf olm-master.tar.bz2
- pushd olm-master && make && sudo make PREFIX="/usr" install && popd
- rm -r olm-master
- wget https://gitlab.matrix.org/matrix-org/olm/-/archive/master/olm-master.tar.bz2
- tar -xvf olm-master.tar.bz2
- pushd olm-master && make && sudo make PREFIX="/usr" install && popd
- rm -r olm-master
install:
- pip install -r requirements.txt
- pip install pytest
- pip install hypothesis
- pip install -r requirements.txt
- pip install pytest
- pip install hypothesis
script:
python -m pytest
script: python -m pytest

View file

@ -73,7 +73,8 @@ from matrix.commands import (hook_commands, hook_page_up,
matrix_redact_command_cb, matrix_topic_command_cb,
matrix_olm_command_cb, matrix_devices_command_cb,
matrix_room_command_cb, matrix_uploads_command_cb,
matrix_upload_command_cb, matrix_send_anyways_cb)
matrix_upload_command_cb, matrix_send_anyways_cb,
matrix_reply_command_cb)
from matrix.completion import (init_completion, matrix_command_completion_cb,
matrix_debug_completion_cb,
matrix_message_completion_cb,

View file

@ -285,6 +285,27 @@ def hook_commands():
"",
)
W.hook_command(
# Command name and short description
"reply-matrix",
"reply to a message",
# Synopsis
('<event-id>[:"<message-part>"] [<reply>]'),
# Description
(
" event-id: event id of the message that will be replied to\n"
"message-part: an initial part of the message (ignored, only "
"used\n"
" as visual feedback when using completion)\n"
" reply: the reply\n"
),
# Completions
("%(matrix_messages)"),
# Function name
"matrix_reply_command_cb",
"",
)
W.hook_command(
# Command name and short description
"topic",
@ -1321,6 +1342,64 @@ def matrix_redact_command_cb(data, buffer, args):
return W.WEECHAT_RC_OK
@utf8_decode
def matrix_reply_command_cb(data, buffer, args):
def predicate(event_id, line):
event_tag = SCRIPT_NAME + "_id_{}".format(event_id)
tags = line.tags
if event_tag in tags:
return True
return False
for server in SERVERS.values():
if buffer in server.buffers.values():
room_buffer = server.find_room_from_ptr(buffer)
# Intentional use of `parse_redact_args` which serves the
# necessary purpose
event_id, reply = parse_redact_args(args)
if not event_id:
message = (
"{prefix}matrix: Invalid command "
"arguments (see /help reply)"
).format(prefix=W.prefix("error"))
W.prnt("", message)
return W.WEECHAT_RC_ERROR
lines = room_buffer.weechat_buffer.find_lines(
partial(predicate, event_id), max_lines=1
)
if not lines:
room_buffer.error(
"No such message with event id "
"{event_id} found.".format(event_id=event_id))
return W.WEECHAT_RC_OK
formatted_data = Formatted.from_input_line(reply)
server.room_send_message(
room_buffer,
formatted_data,
"m.text",
in_reply_to_event_id=event_id,
)
room_buffer.last_message = None
return W.WEECHAT_RC_OK
if buffer == server.server_buffer:
message = (
'{prefix}matrix: command "reply" must be '
"executed on a Matrix channel buffer"
).format(prefix=W.prefix("error"))
W.prnt("", message)
return W.WEECHAT_RC_OK
return W.WEECHAT_RC_OK
def matrix_command_help(args):
if not args:
message = (

View file

@ -1118,6 +1118,7 @@ class MatrixServer(object):
formatted, # type: Formatted
msgtype="m.text", # type: str
ignore_unverified_devices=False, # type: bool
in_reply_to_event_id="", # type: str
):
# type: (...) -> bool
room = room_buffer.room
@ -1126,9 +1127,13 @@ class MatrixServer(object):
content = {"msgtype": msgtype, "body": formatted.to_plain()}
if formatted.is_formatted():
if formatted.is_formatted() or in_reply_to_event_id:
content["format"] = "org.matrix.custom.html"
content["formatted_body"] = formatted.to_html()
if in_reply_to_event_id:
content["m.relates_to"] = {
"m.in_reply_to": {"event_id": in_reply_to_event_id}
}
try:
uuid = self.room_send_event(