From fa1cf5d5bd1f6a4b6ed6fd6c1fd7c1db70fc20b1 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 26 Dec 2022 19:40:51 +0100 Subject: [PATCH] fix specialcharacrter in messages --- lib/FHEM/Devices/Matrix/Client.pm | 65 +++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/lib/FHEM/Devices/Matrix/Client.pm b/lib/FHEM/Devices/Matrix/Client.pm index f52dfe4..6ae13ea 100644 --- a/lib/FHEM/Devices/Matrix/Client.pm +++ b/lib/FHEM/Devices/Matrix/Client.pm @@ -26,6 +26,7 @@ use Carp qw( carp ) ; # wir verwenden Carp für eine bessere Fehlerrückgabe (CoolTux) use Data::Dumper; # Debugging +use Encode; # try to use JSON::MaybeXS wrapper # for chance of better performance + open code @@ -100,6 +101,7 @@ BEGIN { ReadingsVal HttpUtils_NonblockingGet InternalTimer + RemoveInternalTimer gettimeofday AnalyzeCommandChain ) @@ -439,7 +441,9 @@ sub Set { sub Attr { my ( $cmd, $name, $attr_name, $attr_value ) = @_; - Log3( $name, 4, "Attr - $cmd - $name - $attr_name - $attr_value" ); + Log3( $name, 4, + "Attr - $cmd - $name - $attr_name - " + . ( defined($attr_value) && $attr_value ? $attr_value : '' ) ); if ( $cmd eq 'set' ) { if ( $attr_name eq 'matrixQuestion_' ) { @@ -478,6 +482,12 @@ sub Attr { return; } +sub Login { + my $hash = shift; + + return _PerformHttpRequest( $hash, 'login', '' ); +} + sub _Get_Message { # wir machen daraus eine privat function (CoolTux) return 0 unless ( __PACKAGE__ eq caller(0) ) @@ -720,6 +730,30 @@ sub _createParamRefForDef { ); } +sub _createPerformHttpRequestHousekeepingParamObj { + return 0 + unless ( __PACKAGE__ eq caller(0) ) + ; # nur das eigene Package darf private Funktionen aufrufen (CoolTux) + my $createParamRefObj = shift; + + my $param = { + timeout => 10, + hash => $createParamRefObj->{hash} + , # Muss gesetzt werden, damit die Callback funktion wieder $hash hat + def => $createParamRefObj->{def}, # sichern für eventuelle Wiederholung + value => $createParamRefObj->{value} + , # sichern für eventuelle Wiederholung + method => 'POST', # standard, sonst überschreiben + header => 'User-Agent: HttpUtils/2.2.3\r\nAccept: application/json' + , # Den Header gemäß abzufragender Daten setzen + msgnumber => $createParamRefObj->{msgnumber}, # lfd. Nummer Request + callback => \&ParseHttpResponse + , # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten + }; + + return $param; +} + sub _PerformHttpRequest { # wir machen daraus eine privat function (CoolTux) return 0 unless ( __PACKAGE__ eq caller(0) ) @@ -738,7 +772,8 @@ sub _PerformHttpRequest { # wir machen daraus eine privat function (CoolTux) Log3( $name, 4, "$name : Matrix::_PerformHttpRequest $hash" ); - $passwd = $hash->{helper}->{passwdobj}->getReadPassword($name) + $passwd = + encode_utf8( $hash->{helper}->{passwdobj}->getReadPassword($name) ) if ( $def eq 'login' || $def eq 'reg2' ); $hash->{helper}->{msgnumber} = @@ -784,19 +819,8 @@ qq($name $hash->{helper}->{access_token} sync2refresh - $hash->{helper}->{next_r deviceId => $deviceId, }; - my $param = { - timeout => 10, - hash => $hash - , # Muss gesetzt werden, damit die Callback funktion wieder $hash hat - def => $def, # sichern für eventuelle Wiederholung - value => $value, # sichern für eventuelle Wiederholung - method => 'POST', # standard, sonst überschreiben - header => 'User-Agent: HttpUtils/2.2.3\r\nAccept: application/json' - , # Den Header gemäß abzufragender Daten setzen - msgnumber => $msgnumber, # lfd. Nummer Request - callback => \&ParseHttpResponse - , # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten - }; + my $param = + _createPerformHttpRequestHousekeepingParamObj($createParamRefObj); given ($def) { when ('logintypes') { @@ -1225,7 +1249,7 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{ && $tl->{content}->{msgtype} eq 'm.text' ) { my $sender = $tl->{sender}; - my $message = $tl->{content}->{body}; + my $message = encode_utf8( $tl->{content}->{body} ); if ( AttrVal( $name, 'matrixSender', '' ) =~ $sender ) @@ -1248,9 +1272,9 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{ { my $sender = $tl->{sender}; my $message = - $tl->{content} - ->{'org.matrix.msc3381.poll.response'} - ->{answers}[0]; + encode_utf8( $tl->{content} + ->{'org.matrix.msc3381.poll.response'} + ->{answers}[0] ); if ( $tl->{content}->{'m.relates_to'} ) { if ( @@ -1374,7 +1398,8 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{ } RemoveInternalTimer($hash); - InternalTimer( gettimeofday() + $pauseLogin, \&Login, $hash ); + InternalTimer( gettimeofday() + $pauseLogin, + \&FHEM::Devices::Matrix::Client::Login, $hash ); } }