Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit Plugin: Eingehende Nachrichten auswerten
#1
Hallo,

ich habe vor, einen simplen Chatbot zu schreiben, und muss daher auf eingehende Nachrichten zugreifen. Dazu hab ich mal was in Perl zusammengehackt:

Code:
use Data::Dumper;
use Purple;
my %PLUGIN_INFO = (
    perl_api_version => 2,
    name => "Simplebot Plugin",
    version => "0.1",
    summary => "Test plugin for the Perl interpreter.",
    description => "bla",
    author => "ich",
    url => "http://pidgin.im",
    load => "plugin_load",
    unload => "plugin_unload"
);
sub plugin_init {
    return %PLUGIN_INFO;
}
sub plugin_load {
    my $plugin = shift;
    Purple::Debug::info("simplebot", "plugin_load() - Simplebot Loaded.\n");

    Purple::Signal::connect(Purple::Conversations::get_handle(), "received-chat-msg", $plugin, \&msg_cb, "");

}

sub plugin_unload {
    my $plugin = shift;
    Purple::Debug::info("testplugin", "plugin_unload() - Test Plugin Unloaded.\n");
}

sub msg_cb {
    my ($acc, $sender, $msg, $conv, $flags) = @_;

    Purple::Debug::info("simplebot", $sender . " said: " .  $msg . "\n");
}

Leider scheint weder $sender noch $msg sinnvolle Daten zu enthalten, stattdessen kommt in etwa so ein String dabei raus: (15:33:37) simplebot: xyz said: xyz
Interessant, leider nur nicht das was ich will. Weiß jemand Rat?

Edit by Freakazoid: Es kommen komische Zeichen raus. Ich habe die mal durch xyz ersetzt, weil die sonst den RSS-Feed kaputt machen.
Zitieren
#2
hallo
wenn ich das richtig sehe benutzt du Perl.
Mir ist das auch schon passiert.
Du solltest mal statt der 64bit Version von Perl die 32bit Version installieren.
(Pidgin ist leider nur ein 32bit Build, ich denke mal daran liegt das)
Danach hat bei mir alles funktioniert.
(eventuell würde es auch reichen die purple lib neu für 64bit zu erstellen?? weis ich aber nicht)

Ich hoffe es hat dir geholfen Smile

mit freundlichen Grüßen

SpeedProg
Meine Homepage:
http://www.speedprog.tk/
Tongue
Zitieren
#3
Hallo SpeedProg,

danke für die Antwort; dass das Perl ist stimmt schon, aber ich denke, dass auf meinem alten Thinkpad X31 eh keine 64-Bit-Programme laufen. Insofern ist alles durchgehend 32 Bit.

Gruß
Dr. Quarkblitz
Zitieren
#4
Ich kann kein Perl...aber in Tcl ist es, dass die Variablen nur einen Name auf die Variablen enthalten, die die eigentliche Information enthalten.

Grund dafür ist, dass man die Inhalte verändern kann.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#5
unter Perl ist das leider Sad nicht so:
Also zumindest ist bei mir das Pidgin dann immer verreckt als ich es als Referenz behandeln wollte.
Funktioniert einwandfrei:
Code:
use Purple;
use GD;
use Win32::Lglcd;
my $version = "1.0.2";

%PLUGIN_INFO = (
    perl_api_version => 2,
    name => "PidGin G15",
    version => $version,
    summary => "Nachrichten dem G15 LCD",
    description => "Das Plugin zeigt eine Benachrichtigung wenn jemand online oder offline geht. Später wird auch das Versenden von Nachrichten möglich sein. Hoffe ich.",
    author => "Constantin Wenger aka SpeedProg <constantin.wenger\@googlemail.com>",
    url => "http://www.speedprog.tk",
    load => "plugin_load",
    unload => "plugin_unload"
);

my %UML = ( 'Ä' => 'Ae', 'Ö' => 'Oe', 'ô' => 'o', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '»' => '>>', '«' => '<<', '&apos;' => '\'', '&quot;' => '"', '&amp;' => '&' );
my @UMLKEYS = join("|", keys(%UML));
my @msglist = ("");
my $msglistlen = -1;
my $x = 0;
my $font = gdTinyFont;
my $im = new GD::Image(160,43,0) or error("can't create image!\n");
my $white = $im->colorAllocate(255,255,255) or error("can't allocate color white!\n");
my $black = $im->colorAllocate(0,0,0) or error("can't allocate color black!\n");

sub error {
    my ($msg) = @_;
    Purple::Debug::error("PidGin G15", "VERSION:". $version ."\n". $msg ."\n");
}

sub adScreenMsg {
    my ($msg) = @_;
    error("MSG:". $msg);
    $msg =~ s/(@UMLKEYS)/$UML{$1}/g;
    while(length($msg) > 0){
        $msglistlen=$msglistlen+1;
        if(length($msg) > 32){
            error("Laenge: ". length($msg));
            my $spacepos = rindex($msg, " ", 31);
            if($spacepos == -1){
                error("Kein Leerzeichen")
                $msglist[$msglistlen] = substr($msg, 0, 32);
                error("Hinzugefuegt: ". substr($msg, 0, 32));
                $msg = substr($msg, 32);
              }
              else{
                error("Leerzeichen bei: ".$spacepos);
                $msglist[$msglistlen] = substr($msg, 0, $spacepos);
                error("Hinzugefuegt: ". $msglist[$msglistlen]);
                $msg = substr($msg, $spacepos+1);
              }
        }
            else{
                  $msglist[$msglistlen] = substr($msg, 0);
                  $msg = "";
           }
    }
}

sub onSoftButtonChanged {
    my ($connection, $button, $params) = @_;
    return 0;
}

sub plugin_init {
    return %PLUGIN_INFO;
}

sub signedon_cb {
    my ($user, $data) = @_;
    adScreenMsg($user->get_alias . " ist online!");
    $im->filledRectangle(0,0,159,42,$white);
    if($msglistlen > 3){
        $im->string($font,0,0, $msglist[$msglistlen-4], $black);
    }
    if($msglistlen > 2){
        $im->string($font,0,8, $msglist[$msglistlen-3], $black);
    }
    if($msglistlen > 1){
        $im->string($font,0,16, $msglist[$msglistlen-2], $black);
    }
    if($msglistlen > 0){
        $im->string($font,0,24, $msglist[$msglistlen-1], $black);
    }
    $im->string($font,0,32, $msglist[$msglistlen], $black);
    my $pict = $im->Lglcd( 'x'=> $x ) or error("can't transform to lglcd pic!\n");
    $g15->sendbmp($pict) or error("can't send pic to screen!\n");
}

sub signedoff_cb {
    my ($user, $data) = @_;
    adScreenMsg($user->get_alias . " ist offline!");
    #Purple::Debug::info("PidGin G15", $user->get_alias . " ist offline\n");
    $im->filledRectangle(0,0,159,42,$white);
    if($msglistlen > 3){
        $im->string($font,0,0, $msglist[$msglistlen-4], $black);
    }
    if($msglistlen > 2){
        $im->string($font,0,8, $msglist[$msglistlen-3], $black);
    }
    if($msglistlen > 1){
        $im->string($font,0,16, $msglist[$msglistlen-2], $black);
    }
    if($msglistlen > 0){
        $im->string($font,0,24, $msglist[$msglistlen-1], $black);
    }
    $im->string($font,0,32, $msglist[$msglistlen], $black);
    my $pict = $im->Lglcd( 'x'=> $x ) or error("can't transform to lglcd pic!\n");
    $g15->sendbmp($pict) or error("can't send pic to screen!\n");
}

sub receivedmsg_cb {
    my($account, $sender, $message, $conv, $flags, $data) = @_;
    while($message =~ m/<FONT.*?>(.*)<\/FONT>/){
        $message = $1;
    }
    adScreenMsg($sender . ": " . $message);
    error($sender . " hat eine Nachricht geschrieben\n");
    $im->filledRectangle(0,0,159,42,$white);
    if($msglistlen > 3){
        $im->string($font,0,0, $msglist[$msglistlen-4], $black);
    }
    if($msglistlen > 2){
        $im->string($font,0,8, $msglist[$msglistlen-3], $black);
    }
    if($msglistlen > 1){
        $im->string($font,0,16, $msglist[$msglistlen-2], $black);
    }
    if($msglistlen > 0){
        $im->string($font,0,24, $msglist[$msglistlen-1], $black);
    }
    $im->string($font,0,32, $msglist[$msglistlen], $black);
    my $pict = $im->Lglcd( 'x'=> $x ) or error("can't transform to lglcd pic!\n");
    $g15->sendbmp($pict) or error("can't send pic to screen!\n");
}

sub plugin_load {
    my $plugin = shift;
    $data = "";
    $blist_h = Purple::BuddyList::get_handle() or error("FUNC_FAIL => Purple::BuddyList::get_handle();\n");
    $conv_h = Purple::Conversations::get_handle() or error("FUNC_FAIL => Purple::Conversations::get_handle();\n");
    Purple::Signal::connect($blist_h, "buddy-signed-on", $plugin, \&signedon_cb, $data) or error("FUNC_FAIL => Purple::Signal::connect($blist_h, \"buddy-signed-on\", $plugin, \&signedon_cb, $data);\n");
    Purple::Signal::connect($blist_h, "buddy-signed-off", $plugin, \&signedoff_cb, $data) or error("FUNC_FAIL => Purple::Signal::connect($blist_h, \"buddy-signed-off\", $plugin, \&signedoff_cb, $data);\n");
    Purple::Signal::connect($conv_h, "received-im-msg", $plugin, \&receivedmsg_cb, $data) or error("FUNC_FAIL => Purple::Signal::connect($conv_h, \"received-im-msg\", $plugin, \&receivedmsg_cb, $data);\n");
    Purple::Signal::connect($conv_h, "received-chat-msg", $plugin, \&receivedmsg_cb, $data) or error("FUNC_FAIL => Purple::Signal::connect($conv_h, \"received-chat-msg\", $plugin, \&receivedmsg_cb, $data);\n");
    $g15 = Win32::Lglcd->new or error("FUNC_FAIL => Win32::Lglcd->new;\n");
    $g15->init() or error("FUNC_FAIL => $g15->init();\n");
    $g15->connect('PidGin G15') or error("FUNC_FAIL => $g15->connect('PidGin G15');\n");
    $g15->use_families(LGLCD_DEVICE_FAMILY_KEYBOARD_G15) or error("FUNC_FAIL => $g15->use_families(LGLCD_DEVICE_FAMILY_KEYBOARD_G15);\n");
    $g15->open(callback=>\&onSoftButtonChanged) or error("FUNC_FAIL => $g15->open(callback=>\&onSoftButtonChanged);\n");
    $g15->foreground() or error("FUNC_FAIL => $g15->foreground();\n");
    $im->filledRectangle(0,0,159,42,$white) or error("FUNC_FAIL => Win32::Lglcd->new;\n");
    $im->string(gdGiantFont,0,5, "PidGin G15 Plugin" ,$black) or error("FUNC_FAIL => Win32::Lglcd->new;\n");
    my $pict = $im->Lglcd( 'x'=> $x ) or error("FUNC_FAIL => $im->Lglcd( 'x'=> $x );\n");
    $g15->sendbmp($pict) or error("FUNC_FAIL => $g15->sendbmp($pict);\n");
    Purple::Debug::info("PidGin G15", "plugin_load() - Plugin loaded.\n");
}

sub plugin_unload {
  my $plugin = shift;
    $g15->close() or error("can't close devices!\n");
    #$g15->disconnect() or Purple::Debug::error("PidGin G15", "can't disconnect library Win32::Lglcd!\n");
    #$g15->deinit() or Purple::Debug::error("PidGin G15", "can't free library Win32::Lglcd!\n");
    Purple::Debug::info("PidGin G15", "plugin_unload() - Plugin unloaded.\n");
}
Meine Homepage:
http://www.speedprog.tk/
Tongue
Zitieren
#6
Vermutlich weil du das falsche Signal benutzt, hm.

received_im_msg kommt nachdem eine Nachricht empfangen und dargestellt wurde, richtig wäre receiving_im_msg .
Zumindest wenn du die Nachricht verändern willst.

Das erklärt aber nur, warum Pidgin abstürzt und nicht, warum in den Variablen Mist steht, wenn du sie nicht als Referenz benutzt.

http://developer.pidgin.im/doxygen/dev/h...gnals.html
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#7
Sehr interessant. Wenn ich received-chat-msg nehme, steht in $sender tatsächlich der Name drin. Leider in $message aber auch... Dodgy
Beides sind Skalare, also keine Skalar-Referenzen. Bug?
Zitieren
#8
hm wie gesagt, bei mir was das mal wegen 64bit Perl so. Allerdings war da Name und Message irgendwelche komischen Zeichen.
Was benutzt du den für ein BS? Windows/Linux? 64bit/32bit?
Was für ein Perl?
Dann können wir dir vllt besser helfen.
@Freakazoid :
Ich will die Nachrichten ja gar nicht verändern Smile
Hm ok, das hätte ich anschauen sollen, aber als ich receiving genommen habe damals, konnte ich das glaube ich auch nicht verändern.
Werde das mal checken sobald ich daheim bin.
Meine Homepage:
http://www.speedprog.tk/
Tongue
Zitieren
#9
Hallo SpeedProg,

danke für dein Engagement. Also OS ist Xubuntu 10.04, 32 Bit. Vorausgesetzt Pidgin verwendet das auf dem System installierte Perl und kein eigenes, handelt es sich um

Code:
laptop:~$ perl -V
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
  
  Platform:
    osname=linux, osvers=2.6.24-27-server, archname=i486-linux-gnu-thread-multi
    uname='linux vernadsky 2.6.24-27-server #1 smp fri mar 12 01:45:06 utc 2010 i686 gnulinux '
(...)
Zitieren
#10
(05.12.2010, 16:57)Dr. Quarkblitz schrieb: Sehr interessant. Wenn ich received-chat-msg nehme, steht in $sender tatsächlich der Name drin. Leider in $message aber auch... Dodgy
Beides sind Skalare, also keine Skalar-Referenzen. Bug?
Nur angemerkt einfach mal den Inhalt ausgeben lassen, wenn man sich unsicher ist.
Code:
use Data::Dumper;
print Dumper($message);

Pidgin und Perl ist eine wacklige Brücke aber Bugs gibt es weniger mehr Mangel an Features. Auch die Dokumentationen dazu sind mangelhaft.

@SpeedProg
Ich entnehme deinem Posting das Win32::Lglcd bei Dir fehlerfrei läuft?
Habe Probleme mit der Kompilierung (Win7,32-Bit Perl 5.14,Software+Quellcode von Logitech) und weiss nicht ob es an zu neuen Quellen/Hardware liegt oder ich etwas übersehe. Habe Dir auch eine private Nachricht gesendet. Würde mich über eine Antwort freuen bzgl. Vorgehensweise der Kompilierung/Version.

EDIT: Ich danke SpeedProg für Hinweise und Tipps. Wer das Problem auch hat, der sollte einfach eine ältere Edition von der Logitech Software (und SDK) wie lgps304j.exe nutzen. Hab LCDSDK_3.04.137.zip angehängt womit das Modul unter Windows 7 64-Bit mit ActivePerl 5.14 (32-Bit) funktioniert. Funktioniert auch mit G19s noch problemlos.


Angehängte Dateien
.zip   LCDSDK_3.04.137.zip (Größe: 706.04 KB / Downloads: 278)
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste