unix-like LF and infos from developer-wiki

This commit is contained in:
Manfred 2022-11-12 17:11:08 +01:00
parent e629b1e0c9
commit cb996eb3e7
2 changed files with 91 additions and 83 deletions

View File

@ -124,7 +124,7 @@ sub Initialize {
<li><i>pollFullstate</i><br> <li><i>pollFullstate</i><br>
Defaults to "0": Set pollFullstate to "1" for getting in the next sync a full state of all rooms</li> Defaults to "0": Set pollFullstate to "1" for getting in the next sync a full state of all rooms</li>
<a id="Matrix-set-question"></a> <a id="Matrix-set-question"></a>
<li><i>question.start</i><br> <li><i>question</i><br>
Start a question in the room from reading room. The first answer to the question is logged and ends the question.</li> Start a question in the room from reading room. The first answer to the question is logged and ends the question.</li>
<a id="Matrix-set-questionEnd"></a> <a id="Matrix-set-questionEnd"></a>
<li><i>questionEnd</i><br> <li><i>questionEnd</i><br>
@ -163,12 +163,12 @@ sub Initialize {
<li><i>MatrixQuestion_[0..9]+</i> &lt;question&gt;:&lt;answer 1&gt;:&lt;answer 2&gt;:...&lt;answer max. 20&gt;<br> <li><i>MatrixQuestion_[0..9]+</i> &lt;question&gt;:&lt;answer 1&gt;:&lt;answer 2&gt;:...&lt;answer max. 20&gt;<br>
Prepared questions. Prepared questions.
</li> </li>
<a id="Matrix-attr-MatrixAnswer_"></a> <a id="Matrix-attr-matrixAnswer_"></a>
<li><i>MatrixAnswer_[0..9]</i><br> <li><i>matrixAnswer_[0..9]</i><br>
Prepared commands. Prepared commands.
</li> </li>
<a id="Matrix-attr-MatrixAnswer__0-9__"></a> <a id="Matrix-attr-matrixAnswer__0-9__"></a>
<li><i>MatrixAnswer_[0..9]</i><br> <li><i>matrixAnswer_[0..9]</i><br>
Prepared commands. Prepared commands.
</li> </li>
<a id="Matrix-attr-MatrixRoom"></a> <a id="Matrix-attr-MatrixRoom"></a>
@ -270,12 +270,12 @@ sub Initialize {
<li><i>MatrixMessage</i> &lt;room-id&gt;<br> <li><i>MatrixMessage</i> &lt;room-id&gt;<br>
Setzt die Raum-ID in die alle Nachrichten gesendet werden. Zur Zeit ist nur ein Raum möglich. Setzt die Raum-ID in die alle Nachrichten gesendet werden. Zur Zeit ist nur ein Raum möglich.
</li> </li>
<a id="Matrix-attr-MatrixAnswer_"></a> <a id="Matrix-attr-matrixAnswer_"></a>
<li><i>MatrixAnswer_</i><br> <li><i>matrixAnswer_</i><br>
Antworten = Befehle ausführen ist noch nicht freigegeben Antworten = Befehle ausführen ist noch nicht freigegeben
</li> </li>
<a id="Matrix-attr-MatrixAnswer__0-9__"></a> <a id="Matrix-attr-matrixAnswer__0-9__"></a>
<li><i>MatrixAnswer_[0-9]+</i><br> <li><i>matrixAnswer_[0-9]+</i><br>
Antworten = Befehle ausführen ist noch nicht freigegeben Antworten = Befehle ausführen ist noch nicht freigegeben
</li> </li>
<a id="Matrix-attr-MatrixQuestion_"></a> <a id="Matrix-attr-MatrixQuestion_"></a>
@ -308,10 +308,14 @@ sub Initialize {
<li><b>eventId</b> - ID der letzten Nachricht</li> <li><b>eventId</b> - ID der letzten Nachricht</li>
<li><b>filterId</b> - ID des Filters, der Voraussetzung für eine Longpoll-Verbindung zum Server ist</li> <li><b>filterId</b> - ID des Filters, der Voraussetzung für eine Longpoll-Verbindung zum Server ist</li>
<li><b>homeServer</b> - Rückmeldung des Servers unter welchem Namen er erreichbar ist</li> <li><b>homeServer</b> - Rückmeldung des Servers unter welchem Namen er erreichbar ist</li>
<li><b>httpStatus</b> - Statuscode der letzten Serverantwort</li>
<li><b>lastLogin</b> - Statuscode und Zeit des letzten Logins</li>
<li><b>lastRefresh</b> - Statuscode und Zeit des letzten erhaltenen Accesstokens</li>
<li><b>logintypes</b> - unterstützte Login-Möglichkeiten des Servers. Zur Zeit ist "password" die einzige unterstützte Version</li> <li><b>logintypes</b> - unterstützte Login-Möglichkeiten des Servers. Zur Zeit ist "password" die einzige unterstützte Version</li>
<li><b>message</b> - letzte empfangene Nachricht</li> <li><b>message</b> - letzte empfangene Nachricht</li>
<li><b>poll</b> - 0: kein Empfang, 1: Empfang eingeschaltet</li> <li><b>poll</b> - 0: kein Empfang, 1: Empfang eingeschaltet</li>
<li><b>question_id</b> - ID der letzten Frage</li> <li><b>questionId</b> - ID der letzten Frage</li>
<li><b>requestError</b> - Letzte Serveranfrage mit Fehlerantwort</li>
<li><b>sender</b> - Sender der letzten Nachricht</li> <li><b>sender</b> - Sender der letzten Nachricht</li>
<li><b>since</b> - Schlüssel vom Server bis zu welcher Nachricht der Empfang erfolgreich ist</li> <li><b>since</b> - Schlüssel vom Server bis zu welcher Nachricht der Empfang erfolgreich ist</li>
<li><b>userId</b> - Antwort des Servers welcher Account eingeloggt ist</li> <li><b>userId</b> - Antwort des Servers welcher Account eingeloggt ist</li>

View File

@ -50,7 +50,7 @@ my $Module_Version = '0.0.7';
my $language = 'EN'; my $language = 'EN';
sub Attr_List{ sub Attr_List{
return "MatrixRoom MatrixSender MatrixMessage MatrixQuestion_ MatrixQuestion_[0-9]+ MatrixAnswer_ MatrixAnswer_[0-9]+ $readingFnAttributes"; return "matrixRoom matrixSender matrixMessage matrixQuestion_ matrixQuestion_[0-9]+ matrixAnswer_ matrixAnswer_[0-9]+ $readingFnAttributes";
} }
sub Define { sub Define {
@ -222,17 +222,17 @@ sub Attr {
my ($cmd,$name,$attr_name,$attr_value) = @_; my ($cmd,$name,$attr_name,$attr_value) = @_;
Log3($name, 1, "Attr - $cmd - $name - $attr_name - $attr_value"); Log3($name, 1, "Attr - $cmd - $name - $attr_name - $attr_value");
if($cmd eq "set") { if($cmd eq "set") {
if ($attr_name eq "MatrixQuestion_") { if ($attr_name eq "matrixQuestion_") {
my @erg = split(/ /, $attr_value, 2); my @erg = split(/ /, $attr_value, 2);
#$_[2] = "MatrixQuestion_n"; #$_[2] = "matrixQuestion_n";
return qq("attr $name $attr_name" ).I18N('require2') if (!$erg[1] || $erg[0] !~ /[0-9]/); return qq("attr $name $attr_name" ).I18N('require2') if (!$erg[1] || $erg[0] !~ /[0-9]/);
$_[2] = "MatrixQuestion_$erg[0]"; $_[2] = "matrixQuestion_$erg[0]";
$_[3] = $erg[1]; $_[3] = $erg[1];
} }
if ($attr_name eq "MatrixAnswer_") { if ($attr_name eq "matrixAnswer_") {
my @erg = split(/ /, $attr_value, 2); my @erg = split(/ /, $attr_value, 2);
return qq(wrong arguments $attr_name") if (!$erg[1] || $erg[0] !~ /[0-9]+/); return qq(wrong arguments $attr_name") if (!$erg[1] || $erg[0] !~ /[0-9]+/);
$_[2] = "MatrixAnswer_$erg[0]"; $_[2] = "matrixAnswer_$erg[0]";
$_[3] = $erg[1]; $_[3] = $erg[1];
} }
} }
@ -242,8 +242,8 @@ sub Attr {
sub Get_Message($$$) { sub Get_Message($$$) {
my($name, $def, $message) = @_; my($name, $def, $message) = @_;
Log3($name, 5, "$name - $def - $message"); Log3($name, 5, "$name - $def - $message");
my $q = AttrVal($name, "MatrixQuestion_$def", ""); my $q = AttrVal($name, "matrixQuestion_$def", "");
my $a = AttrVal($name, "MatrixAnswer_$def", ""); my $a = AttrVal($name, "matrixAnswer_$def", "");
my @questions = split(':',$q); my @questions = split(':',$q);
shift @questions; shift @questions;
my @answers = split(':', $a); my @answers = split(':', $a);
@ -286,6 +286,7 @@ sub PerformHttpRequest($$$)
$data{MATRIX}{"$name"}{'LASTSEND'} = $now; # remember when last sent $data{MATRIX}{"$name"}{'LASTSEND'} = $now; # remember when last sent
if ($def eq "sync" && $data{MATRIX}{"$name"}{"next_refresh"} < $now){ if ($def eq "sync" && $data{MATRIX}{"$name"}{"next_refresh"} < $now){
$def = "refresh"; $def = "refresh";
Log3($name, 3, qq($name - sync2refresh - $data{MATRIX}{"$name"}{"next_refresh"} < $now) );
$data{MATRIX}{"$name"}{"next_refresh"} = $now + 300; $data{MATRIX}{"$name"}{"next_refresh"} = $now + 300;
} }
@ -319,12 +320,12 @@ sub PerformHttpRequest($$$)
$param->{'url'} = $hash->{server}."/.well-known/matrix/client"; $param->{'url'} = $hash->{server}."/.well-known/matrix/client";
} }
if ($def eq "msg"){ if ($def eq "msg"){
$param->{'url'} = $hash->{server}.'/_matrix/client/r0/rooms/'.AttrVal($name, 'MatrixMessage', '!!').'/send/m.room.message?access_token='.$data{MATRIX}{"$name"}{"access_token"}; $param->{'url'} = $hash->{server}.'/_matrix/client/r0/rooms/'.AttrVal($name, 'matrixMessage', '!!').'/send/m.room.message?access_token='.$data{MATRIX}{"$name"}{"access_token"};
$param->{'data'} = '{"msgtype":"m.text", "body":"'.$value.'"}'; $param->{'data'} = '{"msgtype":"m.text", "body":"'.$value.'"}';
} }
if ($def eq "question"){ if ($def eq "question"){
$data{MATRIX}{"$name"}{"question"}=$value; $data{MATRIX}{"$name"}{"question"}=$value;
$value = AttrVal($name, "MatrixQuestion_$value",""); # if ($value =~ /[0-9]/); $value = AttrVal($name, "matrixQuestion_$value",""); # if ($value =~ /[0-9]/);
my @question = split(':',$value); my @question = split(':',$value);
my $size = @question; my $size = @question;
my $answer; my $answer;
@ -332,7 +333,7 @@ sub PerformHttpRequest($$$)
$value =~ s/:/<br>/g; $value =~ s/:/<br>/g;
# min. question and one answer # min. question and one answer
if (int(@question) >= 2){ if (int(@question) >= 2){
$param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'MatrixMessage', '!!'). $param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'matrixMessage', '!!').
'/send/m.poll.start?access_token='.$data{MATRIX}{"$name"}{"access_token"}; '/send/m.poll.start?access_token='.$data{MATRIX}{"$name"}{"access_token"};
$param->{'data'} = '{"org.matrix.msc3381.poll.start": {"max_selections": 1,'. $param->{'data'} = '{"org.matrix.msc3381.poll.start": {"max_selections": 1,'.
'"question": {"org.matrix.msc1767.text": "'.$q.'"},'. '"question": {"org.matrix.msc1767.text": "'.$q.'"},'.
@ -349,8 +350,8 @@ sub PerformHttpRequest($$$)
} }
} }
if ($def eq "questionEnd"){ if ($def eq "questionEnd"){
$value = ReadingsVal($name, "question_id", "") if (!$value); $value = ReadingsVal($name, "questionId", "") if (!$value);
$param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'MatrixMessage', '!!').'/send/m.poll.end?access_token='.$data{MATRIX}{"$name"}{"access_token"}; $param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'matrixMessage', '!!').'/send/m.poll.end?access_token='.$data{MATRIX}{"$name"}{"access_token"};
# ""'.ReadingsVal($name, 'questionEventId', '!!').' # ""'.ReadingsVal($name, 'questionEventId', '!!').'
$param->{'data'} = '{"m.relates_to": {"rel_type": "m.reference","eventId": "'.$value.'"},"org.matrix.msc3381.poll.end": {},'. $param->{'data'} = '{"m.relates_to": {"rel_type": "m.reference","eventId": "'.$value.'"},"org.matrix.msc3381.poll.end": {},'.
'"org.matrix.msc1767.text": "Antort '.ReadingsVal($name, "answer", "").' erhalten von '.ReadingsVal($name, "sender", "").'"}'; '"org.matrix.msc1767.text": "Antort '.ReadingsVal($name, "answer", "").' erhalten von '.ReadingsVal($name, "sender", "").'"}';
@ -378,7 +379,7 @@ sub PerformHttpRequest($$$)
$param->{'data'} .= '"event_fields": ["type","content","sender"],'; $param->{'data'} .= '"event_fields": ["type","content","sender"],';
$param->{'data'} .= '"event_format": "client", '; $param->{'data'} .= '"event_format": "client", ';
$param->{'data'} .= '"presence": { "senders": [ "@xx:example.com"]}'; # no presence $param->{'data'} .= '"presence": { "senders": [ "@xx:example.com"]}'; # no presence
#$param->{'data'} .= '"room": { "ephemeral": {"rooms": ["'.AttrVal($name, 'MatrixRoom', '!!').'"],"types": ["m.receipt"]}, "state": {"types": ["m.room.*"]},"timeline": {"types": ["m.room.message"] } }'; #$param->{'data'} .= '"room": { "ephemeral": {"rooms": ["'.AttrVal($name, 'matrixRoom', '!!').'"],"types": ["m.receipt"]}, "state": {"types": ["m.room.*"]},"timeline": {"types": ["m.room.message"] } }';
$param->{'data'} .= '}'; $param->{'data'} .= '}';
} }
} }
@ -409,8 +410,8 @@ sub ParseHttpResponse($)
readingsBulkUpdate($hash, "httpStatus", $param->{code}); readingsBulkUpdate($hash, "httpStatus", $param->{code});
$hash->{STATE} = $def.' - '.$param->{code}; $hash->{STATE} = $def.' - '.$param->{code};
if($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist if($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
Log3($name, 3, "error while requesting ".$param->{url}." - $err"); # Eintrag fürs Log Log3($name, 2, "error while requesting ".$param->{url}." - $err"); # Eintrag fürs Log
readingsBulkUpdate($hash, "fullResponse", "ERROR ".$err); # Readings erzeugen readingsBulkUpdate($hash, "responseError", $err); # Reading erzeugen
$data{MATRIX}{"$name"}{"FAILS"} = 3; $data{MATRIX}{"$name"}{"FAILS"} = 3;
} }
elsif($data ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes) elsif($data ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
@ -421,6 +422,7 @@ sub ParseHttpResponse($)
$data{MATRIX}{"$name"}{"FAILS"} = 0; $data{MATRIX}{"$name"}{"FAILS"} = 0;
} else { } else {
$data{MATRIX}{"$name"}{"FAILS"}++; $data{MATRIX}{"$name"}{"FAILS"}++;
readingsBulkUpdate($hash, "responseError", $data{MATRIX}{"$name"}{"FAILS"}.' - '.$data);
} }
# readingsBulkUpdate($hash, "fullResponse", $data); # readingsBulkUpdate($hash, "fullResponse", $data);
@ -447,19 +449,21 @@ sub ParseHttpResponse($)
$data{MATRIX}{"$name"}{"session"} = $decoded->{'session'}; $data{MATRIX}{"$name"}{"session"} = $decoded->{'session'};
$nextRequest = "";#"reg2"; $nextRequest = "";#"reg2";
} }
if ($param->{code} == 200 && ($def eq "reg2" || $def eq "login" || $def eq "refresh")){ if ($def eq "reg2" || $def eq "login" || $def eq "refresh") {
readingsBulkUpdate($hash, "lastRegister", $param->{code}) if $def eq "reg2";
readingsBulkUpdate($hash, "lastLogin", $param->{code}) if $def eq "login";
readingsBulkUpdate($hash, "lastRefresh", $param->{code}) if $def eq "refresh";
if ($param->{code} == 200){
readingsBulkUpdate($hash, "userId", $decoded->{'userId'}) if ($decoded->{'userId'}); readingsBulkUpdate($hash, "userId", $decoded->{'userId'}) if ($decoded->{'userId'});
readingsBulkUpdate($hash, "homeServer", $decoded->{'homeServer'}) if ($decoded->{'homeServer'}); readingsBulkUpdate($hash, "homeServer", $decoded->{'homeServer'}) if ($decoded->{'homeServer'});
readingsBulkUpdate($hash, "deviceId", $decoded->{'deviceId'}) if ($decoded->{'deviceId'}); readingsBulkUpdate($hash, "deviceId", $decoded->{'deviceId'}) if ($decoded->{'deviceId'});
readingsBulkUpdate($hash, "last_register", $param->{code}) if $def eq "reg2";
readingsBulkUpdate($hash, "last_login", $param->{code}) if $def eq "login";
readingsBulkUpdate($hash, "last_refresh", $param->{code}) if $def eq "refresh";
$data{MATRIX}{"$name"}{"expires"} = $decoded->{'expires_in_ms'} if ($decoded->{'expires_in_ms'}); $data{MATRIX}{"$name"}{"expires"} = $decoded->{'expires_in_ms'} if ($decoded->{'expires_in_ms'});
$data{MATRIX}{"$name"}{"refresh_token"} = $decoded->{'refresh_token'} if ($decoded->{'refresh_token'}); $data{MATRIX}{"$name"}{"refresh_token"} = $decoded->{'refresh_token'} if ($decoded->{'refresh_token'});
$data{MATRIX}{"$name"}{"access_token"} = $decoded->{'access_token'} if ($decoded->{'access_token'}); $data{MATRIX}{"$name"}{"access_token"} = $decoded->{'access_token'} if ($decoded->{'access_token'});
$data{MATRIX}{"$name"}{"next_refresh"} = $now + $data{MATRIX}{"$name"}{"expires"}/1000 - 60; # refresh one minute before end $data{MATRIX}{"$name"}{"next_refresh"} = $now + $data{MATRIX}{"$name"}{"expires"}/1000 - 60; # refresh one minute before end
} }
}
if ($def eq "wellknown"){ if ($def eq "wellknown"){
# https://spec.matrix.org/unstable/client-server-api/ # https://spec.matrix.org/unstable/client-server-api/
} }
@ -474,9 +478,9 @@ sub ParseHttpResponse($)
my $member = ""; my $member = "";
#my $room = $list->{$id}; #my $room = $list->{$id};
$pos = $pos + 1; $pos = $pos + 1;
# MatrixRoom ? # matrixRoom ?
readingsBulkUpdate($hash, "room$pos.id", $id); readingsBulkUpdate($hash, "room$pos.id", $id);
#foreach my $id ( $decoded->{'rooms'}->{'join'}->{AttrVal($name, 'MatrixRoom', '!!')}->{'timeline'}->{'events'}->@* ) { #foreach my $id ( $decoded->{'rooms'}->{'join'}->{AttrVal($name, 'matrixRoom', '!!')}->{'timeline'}->{'events'}->@* ) {
foreach my $ev ( $list->{$id}->{'state'}->{'events'}->@* ) { foreach my $ev ( $list->{$id}->{'state'}->{'events'}->@* ) {
readingsBulkUpdate($hash, "room$pos.topic", $ev->{'content'}->{'topic'}) if ($ev->{'type'} eq 'm.room.topic'); readingsBulkUpdate($hash, "room$pos.topic", $ev->{'content'}->{'topic'}) if ($ev->{'type'} eq 'm.room.topic');
readingsBulkUpdate($hash, "room$pos.name", $ev->{'content'}->{'name'}) if ($ev->{'type'} eq 'm.room.name'); readingsBulkUpdate($hash, "room$pos.name", $ev->{'content'}->{'name'}) if ($ev->{'type'} eq 'm.room.name');
@ -489,20 +493,20 @@ sub ParseHttpResponse($)
if ($tl->{'type'} eq 'm.room.message' && $tl->{'content'}->{'msgtype'} eq 'm.text'){ if ($tl->{'type'} eq 'm.room.message' && $tl->{'content'}->{'msgtype'} eq 'm.text'){
my $sender = $tl->{'sender'}; my $sender = $tl->{'sender'};
my $message = $tl->{'content'}->{'body'}; my $message = $tl->{'content'}->{'body'};
if (AttrVal($name, 'MatrixSender', '') =~ $sender){ if (AttrVal($name, 'matrixSender', '') =~ $sender){
readingsBulkUpdate($hash, "message", $message); readingsBulkUpdate($hash, "message", $message);
readingsBulkUpdate($hash, "sender", $sender); readingsBulkUpdate($hash, "sender", $sender);
# command # command
Get_Message($name, '99', $message); Get_Message($name, '99', $message);
} }
#else { #else {
# readingsBulkUpdate($hash, "message", 'ignoriert, nicht '.AttrVal($name, 'MatrixSender', '')); # readingsBulkUpdate($hash, "message", 'ignoriert, nicht '.AttrVal($name, 'matrixSender', ''));
# readingsBulkUpdate($hash, "sender", $sender); # readingsBulkUpdate($hash, "sender", $sender);
#} #}
} elsif ($tl->{'type'} eq "org.matrix.msc3381.poll.response"){ } elsif ($tl->{'type'} eq "org.matrix.msc3381.poll.response"){
my $sender = $tl->{'sender'}; my $sender = $tl->{'sender'};
my $message = $tl->{'content'}->{'org.matrix.msc3381.poll.response'}->{'answers'}[0]; my $message = $tl->{'content'}->{'org.matrix.msc3381.poll.response'}->{'answers'}[0];
if (AttrVal($name, 'MatrixSender', '') =~ $sender){ if (AttrVal($name, 'matrixSender', '') =~ $sender){
readingsBulkUpdate($hash, "message", $message); readingsBulkUpdate($hash, "message", $message);
readingsBulkUpdate($hash, "sender", $sender); readingsBulkUpdate($hash, "sender", $sender);
$nextRequest = "questionEnd" ; $nextRequest = "questionEnd" ;
@ -533,12 +537,12 @@ sub ParseHttpResponse($)
#m.relates_to #m.relates_to
} }
if ($def eq "question"){ if ($def eq "question"){
readingsBulkUpdate($hash, "question_id", $decoded->{'eventId'}) if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "questionId", $decoded->{'eventId'}) if ($decoded->{'eventId'});
#m.relates_to #m.relates_to
} }
if ($def eq "questionEnd"){ if ($def eq "questionEnd"){
readingsBulkUpdate($hash, "eventId", $decoded->{'eventId'}) if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "eventId", $decoded->{'eventId'}) if ($decoded->{'eventId'});
readingsBulkUpdate($hash, "question_id", "") if ($decoded->{'eventId'}); readingsBulkUpdate($hash, "questionId", "") if ($decoded->{'eventId'});
#m.relates_to #m.relates_to
} }
} }