Add support for sending files

tags/patrix-0.1.4-1
Daniel Berteaud 7 years ago
parent 982ef36330
commit ede4d1822b
  1. 7
      README.md
  2. 57
      scripts/patrix

@ -5,10 +5,13 @@ It requires the following perl modules
* HTTP::Request
* Config::Simple
* File::HomeDir
* File::Basename
* File::MimeInfo
* Path::Tiny
* Getopt::Long
* JSON
For now it's very limited, and can only send messages to a room. Here're the vailable options:
For now it's very limited, and can only send text messages and files to a room. Here're the vailable options:
* --user: specify the user you want to login as
* --password: the password to auth against the HS
@ -19,8 +22,10 @@ For now it's very limited, and can only send messages to a room. Here're the vai
* --debug: if present, will be verbose
* --notice: send a notice instead of a message (more or less the same but the client can display it differently. Riot for example will not notify you for notices)
* --conf: path to a conf file. Default conf file is ~/.patrixrc
* --file: if action is send-file, specify the path of the file to send
* --action: what to do. Valid actions are
* send-msg (default): send the text message
* send-file: send a binary file. --file must be set
* get-access-token: just login and print the access token
* get-room-list: prints the list of public rooms of this server

@ -8,6 +8,9 @@ use JSON qw(from_json to_json);
use Getopt::Long;
use Config::Simple;
use File::HomeDir;
use File::MimeInfo;
use File::Basename;
use Path::Tiny;
our $opt;
@ -19,6 +22,7 @@ GetOptions(
"room=s" => \$opt->{room},
"message=s" => \$opt->{message},
"notice" => \$opt->{notice},
"files=s" => \$opt->{file},
"debug" => \$opt->{debug},
"action=s" => \$opt->{action},
"conf=s" => \$opt->{conf}
@ -62,6 +66,9 @@ elsif (!$opt->{access_token} && (!$opt->{user} || !$opt->{password})){
if ($opt->{action} eq 'send-msg' && (!$opt->{room} || !$opt->{message})){
die "You need to provide a room ID and a message";
}
if ($opt->{action} eq 'send-file' && (!$opt->{room} || !$opt->{file})){
die "You need to provide a room ID and a file to send\n";
}
$opt->{server} = 'https://' . $opt->{server} unless ($opt->{server} =~ m|https?://|);
@ -158,6 +165,51 @@ sub send_msg(){
my $resp = $lwp->request( $req );
}
sub send_file(){
if ($opt->{debug}){
print "Uploading file $opt->{file} to the media store\n\n";
}
my $uri = $opt->{server} . '/_matrix/media/v1/upload?access_token=' . $opt->{access_token} . '&filename=' . basename($opt->{file});
my $req = HTTP::Request->new( 'POST', $uri );
$req->header( 'Content-Type' => mimetype $opt->{file} );
$req->content( path( $opt->{file} )->slurp_raw );
my $resp = $lwp->request( $req );
if ($opt->{debug}){
print "File upload response is\n" .
to_json(from_json($resp->decoded_content), { pretty => 1 }) .
"\n\n";
}
unless ( $resp->is_success ){
die "Error uploading file\n";
}
my $file_uri = from_json($resp->decoded_content)->{content_uri};
unless ($file_uri){
die "Error occurred during file upload\n";
}
if ($opt->{debug}){
print "File uploaded, with the URI $file_uri\n";
print "Now Sending the file link to the room $opt->{room}\n\n";
}
$uri = $opt->{server} . '/_matrix/client/r0/rooms/' . $opt->{room} . '/send/m.room.message?access_token=' . $opt->{access_token};
$req = HTTP::Request->new( 'POST', $uri );
my $json = {
msgtype => 'm.file',
body => basename($opt->{file}),
filename => basename($opt->{file}),
info => {
mimetype => mimetype $opt->{file},
size => (stat $opt->{file})[7]
},
url => $file_uri
};
$req->header( 'Content-Type' => 'application/json' );
$req->content( to_json($json) );
$resp = $lwp->request( $req );
unless ( $resp->is_success ){
die "Error posting file link on room $opt->{room}\n";
}
}
sub list_room(){
my $uri = $opt->{server} . '/_matrix/client/r0/publicRooms?access_token=' . $opt->{access_token};
my $req = HTTP::Request->new( 'POST', $uri );
@ -200,6 +252,11 @@ elsif ($opt->{action} eq 'send-msg'){
send_msg();
}
}
elsif ($opt->{action} eq 'send-file'){
login();
join_room();
send_file();
}
logout() if $must_logout;

Loading…
Cancel
Save