Schrift
[thread]12400[/thread]

encoding problem... (sqlite3 Datenbank und ein Bot::BasicBot irc-bot)

Leser: 6


<< >> 4 Einträge, 1 Seite
FoolAck
 2008-08-25 02:07
#113964 #113964
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Hm. Irgendwie funktioniert das hier nicht wirklich mit dem rumencoden.
Zu Bot::BasicBot: $msg->{body} enthält die "Nachricht" und &said ist der callback dafür, dass etwas im "Sichtbarkeitsbereich" des Bots gesagt wird.
Befehle für den Bot: !add <quote>, !delete <ID>, !query <sql-LIKE-pattern>

[edit]
Garnicht gesagt, was genau nicht funktioniert: Umlaute werden beim Abfragen aus der Datenbank falsch dargestellt... (In Verschiedenen Variationen)
[/edit]


Code: (dl )
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
/usr/bin/env perl

package foobot;
use base qw( Bot::BasicBot );

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("dbi:SQLite:dbname=foo.sqlt",
"", "")
or die "Couldn't connect to database!\n$!\n";

sub said {
my ($self, $msg) = @_;

if ($msg->{body} =~ /^!add\s+\S+/i) {
my ($quote) = $msg->{body} =~ /^!add\s+(.+)$/;
my $nick = $msg->{who};
my $sth = $dbh->prepare("INSERT INTO quotes VALUES (?, ?)");
$sth->execute($nick, $quote);
$msg->{body} = undef;
}
elsif ($msg->{body} =~ /^!(?:query|search)\s+\S+/i) {
my ($query) = $msg->{body} =~ /^!(?:query|search)\s+(.+)$/;
$query = "%$query%";
my $sth
= $dbh->prepare(
"SELECT ROWID,who,quote FROM quotes WHERE quote LIKE ? OR who LIKE ?"
);
$sth->execute($query, $query);
my @row;
while (@row = $sth->fetchrow_array()) {
my ($rowID, $who, $quote) = @row;
$msg->{body} = "$quote (ID=$rowID, added by $who)\n";
$self->say($msg);
}
$msg->{body} = undef;
}
elsif ($msg->{body} =~ /^!delete\s+\d+$/i) {
my ($rowID) = $msg->{body} =~ /^!delete\s+(\d+)$/;
my $sth = $dbh->prepare("DELETE FROM quotes WHERE ROWID = ?");
my $retval = $sth->execute($rowID);
$msg->{body}
= ($retval ne '0E0') ? "Deleted quote with ID $rowID\n" : undef;
}
elsif ($msg->{body} =~ /^!cya/i) {
$dbh->disconnect();
exit 0;
}
else {
$msg->{body} = undef;
}

if ($msg->{body}) {
$self->say($msg);
}

return;
}

1;

foobot->new(
server => "irc.euirc.net",
port => "6667",
channels => ['#fooooo'],

nick => "foo",
alt_nicks => ["barbot"],
username => "asdfjkloe",
name => "foobar",

ignore_list => [],

# charset => "latin-1", # charset the bot assumes the channel is using
)->run();

Als "charset" für den Bot war ursprünglich "utf-8" angegeben, aber das hat auch nicht funkioniert.
Ich teste das ganze in xchat, welches auch charset auf UTF-8 hat.
Bizarrerweise ist das einzige was bisher funktioniert hat folgendes: das quote geadded in die Datenbank mit dem Bot::BotBasic-Object auf "charset => 'utf-8'" gestellt und dann die Abfrage dieses Eintrags (nach Neustart des Bots) mit dem Bot-Object auf "charset => 'latin-1'" gestellt....
Verstehen tu ich das alles irgendwie nicht. :/

Wenn Jemand Ideen hat, gerne posten...


edit:
Achja, die Datenbank kann/könnte man so erstellen:
Code: (dl )
1
2
3
4
5
use DBI;
my $dbh=DBI->connect("dbi:SQLite:dbname=foo.sqlt", "", "");
$dbh->do("CREATE TABLE quotes (who, quote)");
$dbh->commit();
$dbh->disconnect();
moritz
 2008-08-25 02:22
#113965 #113965
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Utf-8 als "charset" für den Bot ist schon mal nicht schlecht. Dann musst du vor dem einfügen in die Datenbank noch das ganze als Bytestring kodieren:

Code (perl): (dl )
1
2
3
use Encode qw(encode_utf8 decode_utf8);
...
$sth->execute($nick, encode_utf($quote));


entsprechend musst die Daten, die aus der DB kommen, vermutlich noch mit decode_utf8 verarzten.

Siehe auch Perl, Zeichenkodierungen und Unicode, CPAN:Encode, perluniintro, perlunicode, perlunifaq.
FoolAck
 2008-08-25 02:38
#113967 #113967
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Ey suuuupi :D
Gleich probiert und "funzt" soweit erstmal o/

Und diese ganze Lektüre da hab ich häppchenweise schon hier und da gelesen, aber irgendwie find ich das Thema noch ein wenig zäh... Also auf die Idee mit decode_utf8 und encode_utf8 wäre ich wahrscheinlich nicht so schnell gekommen. Muss ich wohl nochmal bei einer Kanne Kaffee drüber kontemplieren (also über dieses Thema).

Thx nochmal.

(Hatte nicht damit gerechnet so schnell Hilfe zu bekommen :o)
moritz
 2008-08-25 11:49
#113969 #113969
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Lies dir den von mir verlinkten Artikel durch, da erkläre ich, warum man die encode- und decode-Funktionen braucht. Dauert zwar ein bisschen sich das durchzulesen, aber danach sollte einiges klarer sein.
<< >> 4 Einträge, 1 Seite



View all threads created 2008-08-25 02:07.