… | |
… | |
7 | |
7 | |
8 | use CFClient; |
8 | use CFClient; |
9 | use CFClient::UI; |
9 | use CFClient::UI; |
10 | |
10 | |
11 | use base 'Crossfire::Protocol::Base'; |
11 | use base 'Crossfire::Protocol::Base'; |
|
|
12 | |
|
|
13 | our %open_logs; |
12 | |
14 | |
13 | sub new { |
15 | sub new { |
14 | my $class = shift; |
16 | my $class = shift; |
15 | |
17 | |
16 | my $self = $class->SUPER::new (@_); |
18 | my $self = $class->SUPER::new (@_); |
… | |
… | |
58 | # per server |
60 | # per server |
59 | $self->{mapcache} = CFClient::db_table "mapcache_$self->{host}_$self->{port}"; |
61 | $self->{mapcache} = CFClient::db_table "mapcache_$self->{host}_$self->{port}"; |
60 | |
62 | |
61 | $self |
63 | $self |
62 | } |
64 | } |
|
|
65 | |
|
|
66 | sub logprint { |
|
|
67 | my ($self, @a) = @_; |
|
|
68 | my $filename = "$Crossfire::VARDIR/log.$self->{host}"; |
|
|
69 | |
|
|
70 | my $fh = $open_logs{$filename}; |
|
|
71 | unless ($fh) { |
|
|
72 | # FIXME: handle this more gracefully? |
|
|
73 | open $fh, ">>", $filename |
|
|
74 | or die "Couldn't open logfile: log.$self->{host}: $!"; |
|
|
75 | |
|
|
76 | $open_logs{$filename} = $fh; |
|
|
77 | } |
|
|
78 | |
|
|
79 | my ($sec, $min, $hour, $mday, $mon, $year) = localtime (time); |
|
|
80 | |
|
|
81 | my $ts = sprintf "%04d-%02d-%02d %02d:%02d:%02d", |
|
|
82 | $year + 1900, $mon + 1, $mday, $hour, $min, $sec; |
|
|
83 | |
|
|
84 | print $fh "$ts ", @a, "\n"; |
|
|
85 | $fh->flush; |
|
|
86 | } |
|
|
87 | |
|
|
88 | |
63 | |
89 | |
64 | sub stats_update { |
90 | sub stats_update { |
65 | my ($self, $stats) = @_; |
91 | my ($self, $stats) = @_; |
66 | |
92 | |
67 | if (my $exp = $stats->{+CS_STAT_EXP64}) { |
93 | if (my $exp = $stats->{+CS_STAT_EXP64}) { |
… | |
… | |
79 | |
105 | |
80 | if ($self->{record}) { |
106 | if ($self->{record}) { |
81 | push @{$self->{record}}, $command; |
107 | push @{$self->{record}}, $command; |
82 | } |
108 | } |
83 | |
109 | |
|
|
110 | $self->logprint ("send: ", $command); |
84 | $self->send_command ($command); |
111 | $self->send_command ($command); |
85 | ::status $command; |
112 | ::status $command; |
86 | } |
113 | } |
87 | |
114 | |
88 | sub start_record { |
115 | sub start_record { |
… | |
… | |
279 | # I love transactions |
306 | # I love transactions |
280 | for (1..100) { |
307 | for (1..100) { |
281 | my $txn = $CFClient::DB_ENV->txn_begin; |
308 | my $txn = $CFClient::DB_ENV->txn_begin; |
282 | my $status = $self->{facemap}->db_get (id => $id); |
309 | my $status = $self->{facemap}->db_get (id => $id); |
283 | if ($status == 0 || $status == BerkeleyDB::DB_NOTFOUND) { |
310 | if ($status == 0 || $status == BerkeleyDB::DB_NOTFOUND) { |
284 | $id = ($id || 16) + 1; |
311 | $id = ($id || 64) + 1; |
285 | if ($self->{facemap}->put (id => $id) == 0 |
312 | if ($self->{facemap}->put (id => $id) == 0 |
286 | && $self->{facemap}->put ($hash => $id) == 0) { |
313 | && $self->{facemap}->put ($hash => $id) == 0) { |
287 | $txn->txn_commit; |
314 | $txn->txn_commit; |
288 | |
315 | |
289 | goto gotid; |
316 | goto gotid; |
… | |
… | |
369 | [0.55, 0.41, 0.13], |
396 | [0.55, 0.41, 0.13], |
370 | [0.99, 0.77, 0.26], |
397 | [0.99, 0.77, 0.26], |
371 | [0.74, 0.65, 0.41], |
398 | [0.74, 0.65, 0.41], |
372 | ); |
399 | ); |
373 | |
400 | |
|
|
401 | $self->logprint ("info: ", $text); |
|
|
402 | |
374 | my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; |
403 | my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; |
375 | |
404 | |
376 | # try to create single paragraphs of multiple lines sent by the server |
405 | # try to create single paragraphs of multiple lines sent by the server |
377 | $text =~ s/(?<=\S)\n(?=\w)/ /g; |
406 | $text =~ s/(?<=\S)\n(?=\w)/ /g; |
378 | |
407 | |
… | |
… | |
779 | |
808 | |
780 | if ($type eq "msg") { |
809 | if ($type eq "msg") { |
781 | my ($msg, @kw) = split /\x00/, $msg; |
810 | my ($msg, @kw) = split /\x00/, $msg; |
782 | $self->{kw}{$_} = 1 for @kw; |
811 | $self->{kw}{$_} = 1 for @kw; |
783 | |
812 | |
784 | warn "<<<<@kw>>>>\n";#d# |
|
|
785 | |
|
|
786 | $msg = CFClient::UI::Label::escape $msg; |
813 | $msg = CFClient::UI::Label::escape $msg; |
787 | my $match = join "|", map "\\b\Q$_\E\\b", sort { (length $b) <=> (length $a) } keys %{ $self->{kw} }; |
814 | my $match = join "|", map "\\b\Q$_\E\\b", sort { (length $b) <=> (length $a) } keys %{ $self->{kw} }; |
788 | $msg =~ s/($match)/<span foreground='#c0c0ff' underline='none'>$1<\/span>/gi; # underline when http-ready, huh. |
815 | $msg =~ s/($match)/<span foreground='#c0c0ff' underline='none'>$1<\/span>/gi; # underline when http-ready, huh. |
789 | |
816 | |
790 | $self->{textview}->add_paragraph ([1, 1, 1, 1], "\n$msg"); |
817 | $self->{textview}->add_paragraph ([1, 1, 1, 1], "\n$msg"); |