File: events.pl

package info (click to toggle)
libnet-async-matrix-perl 0.19-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 264 kB
  • sloc: perl: 2,595; makefile: 2
file content (119 lines) | stat: -rw-r--r-- 3,025 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/perl

use strict;
use warnings;

use IO::Async::Loop;
use Net::Async::Matrix;
use Net::Netrc;

use Getopt::Long;

use JSON::MaybeXS;

my $JSON = JSON::MaybeXS->new( pretty => 1 );
STDOUT->binmode( ":encoding(UTF-8)" );

sub print_event
{
   my ( $category, $event ) = @_;

   print "$category:\n";
   print $JSON->encode( $event ) =~ s/^/ | /mgr;
}

my %NO;
GetOptions(
   'server=s' => \my $SERVER,
   'SSL'      => \my $SSL,
   'user=s'   => \my $USER,
   'pass=s'   => \my $PASS,

   'no-presence' => \$NO{presence},
   'no-receipt'  => \$NO{receipt},
   'no-typing'   => \$NO{typing},
) or exit 1;

die "Require --server\n" unless defined $SERVER;

if( !defined $PASS ) {
   my $ent = Net::Netrc->lookup( $SERVER, $USER ) or
      die "No --pass given and not found in .netrc\n";

   $USER //= $ent->login;
   $PASS //= $ent->password;
}

my $loop = IO::Async::Loop->new;

my $matrix = Net::Async::Matrix->new(
   server          => $SERVER,
   SSL             => $SSL,
   SSL_verify_mode => 0,

   on_presence => sub {
      my ( undef, $user, %changes ) = @_;
      return if $NO{presence}; ## TODO filter
      print_event( presence => { user_id => $user->user_id, changes => \%changes } );
   },

   on_room_new => sub {
      my ( undef, $room ) = @_;

      $room->configure(
         on_message => sub {
            my ( $room, $member, $content, $event ) = @_;
            print_event( message => {
               %$event,
               room_id => $room->room_id,
            } );
         },
         on_membership => sub {
            my ( $room, $member, $event, $subject, %changes ) = @_;
            print_event( membership => $event );
         },
         on_state_changed => sub {
            my ( $room, $member, $event, %changes ) = @_;
            print_event( state => $event );
         },
         on_typing => sub {
            my ( $room, $member, $is_typing ) = @_;
            return if $NO{typing}; ## TODO: filter
            print_event( typing => {
               room_id => $room->room_id,
               user_id => $member->user->user_id,
               typing  => $is_typing,
            } );
         },
         on_read_receipt => sub {
            my ( $room, $member, $event_id, $content ) = @_;
            return if $NO{receipt};
            print_event( read_receipt => {
               room_id  => $room->room_id,
               user_id  => $member->user->user_id,
               event_id => $event_id,
               ts       => $content->{ts},
            } );
         },
      );
   },
);
$loop->add( $matrix );

print STDERR "Logging in to $SERVER as $USER...\n";

$matrix->login(
   user_id  => $USER,
   password => $PASS,
)->get;

my %filter;
$filter{presence} = { types => [] } if $NO{presence};
push @{ $filter{room}{ephemeral}{not_types} }, "m.receipt" if $NO{receipt};
push @{ $filter{room}{ephemeral}{not_types} }, "m.typing"  if $NO{typing};

my $filter_json = JSON::MaybeXS->new->encode( \%filter );

print STDERR "Event stream started\n";

$loop->run;