package Onis::Plugins::Userdetails; use strict; use warnings; use Onis::Config (qw(get_config)); use Onis::Html (qw(html_escape get_filehandle)); use Onis::Language (qw(translate)); use Onis::Data::Core (qw(get_main_nick register_plugin nick_to_name get_most_recent_time)); use Onis::Users (qw(get_link get_image)); use Onis::Plugins::Core (qw(get_core_nick_counters get_sorted_nicklist)); use Onis::Plugins::Weekdays (qw(get_weekdays)); use Onis::Plugins::Longterm (qw(get_longterm)); use Onis::Plugins::Conversations (qw(get_conversations)); use Onis::Plugins::Bignumbers (qw(get_bignumbers)); use Onis::Plugins::Interestingnumbers (qw(get_interestingnumbers)); our $DisplayImages = 0; our $DefaultImage = ''; register_plugin ('OUTPUT', \&output); our $NumUserdetails = 10; if (get_config ('userdetails_number')) { my $tmp = get_config ('userdetails_number'); $tmp =~ s/\D//g; $NumUserdetails = $tmp if ($tmp); } if (get_config ('display_images')) { my $tmp = get_config ('display_images'); if ($tmp =~ m/true|on|yes/i) { $DisplayImages = 1; } elsif ($tmp =~ m/false|off|no/i) { $DisplayImages = 0; } else { print STDERR $/, __FILE__, ": ``display_times'' has been set to the invalid value ``$tmp''. ", $/, __FILE__, ": Valid values are ``true'' and ``false''. Using default value ``false''."; } } if (get_config ('default_image')) { $DefaultImage = get_config ('default_image'); } our @HorizontalImages = qw#dark-theme/h-red.png dark-theme/h-blue.png dark-theme/h-yellow.png dark-theme/h-green.png#; if (get_config ('horizontal_images')) { my @tmp = get_config ('horizontal_images'); my $i; if (scalar (@tmp) != 4) { # Do nothing: # The core-pligin already complained about this.. } for ($i = 0; $i < 4; $i++) { if (!defined ($tmp[$i])) { next; } $HorizontalImages[$i] = $tmp[$i]; } } our @VerticalImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#; if (get_config ('vertical_images')) { my @tmp = get_config ('vertical_images'); my $i; if (scalar (@tmp) != 4) { # Do nothing: # Hopefully someone complained by now.. } for ($i = 0; $i < 4; $i++) { if (!defined ($tmp[$i])) { next; } $VerticalImages[$i] = $tmp[$i]; } } our $ConversationsNumber = 10; if (get_config ('userdetails_conversations_number')) { my $tmp = get_config ('userdetails_conversations_number'); $tmp =~ s/\D//g; $ConversationsNumber = $tmp if ($tmp); } our $LongtermDays = 7; if (get_config ('userdetails_longterm_days')) { my $tmp = get_config ('userdetails_longterm_days'); $tmp =~ s/\D//g; $LongtermDays = $tmp if ($tmp); } my $VERSION = '$Id: Userdetails.pm,v 1.5 2005/03/14 18:40:25 octo Exp $'; print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG); return (1); sub output { my $nicks_ref = get_sorted_nicklist (); my $fh = get_filehandle (); my $trans = translate ('Detailed nick stats'); my $num; my $max_time = 0; my $max_conv = 0; my $max_weekdays = 0; my $max_longterm = 0; my @nicks = @$nicks_ref; my $nick_data = {}; splice (@nicks, $NumUserdetails) if (scalar (@nicks) > $NumUserdetails); for (@nicks) { my $nick = $_; $nick_data->{$nick} = get_core_nick_counters ($nick); $nick_data->{$nick}{'weekdays'} = get_weekdays ($nick); $nick_data->{$nick}{'longterm'} = get_longterm ($nick); $nick_data->{$nick}{'conversations'} = get_conversations ($nick); $nick_data->{$nick}{'bignumbers'} = get_bignumbers ($nick); $nick_data->{$nick}{'interestingnumbers'} = get_interestingnumbers ($nick); for (my $i = 0; $i < 24; $i++) { $num = $nick_data->{$nick}{'chars'}[$i]; $max_time = $num if ($max_time < $num); } for (keys %{$nick_data->{$nick}{'conversations'}}) { my $other = $_; my $ptr = $nick_data->{$nick}{'conversations'}{$other}{'nicks'}{$nick}; $num = $ptr->[0] + $ptr->[1] + $ptr->[2] + $ptr->[3]; $max_conv = $num if ($max_conv < $num); } for (keys %{$nick_data->{$nick}{'weekdays'}}) { my $ptr = $nick_data->{$nick}{'weekdays'}{$_}; for (my $i = 0; $i < 4; $i++) { $max_weekdays = $ptr->[$i] if ($max_weekdays < $ptr->[$i]); } } if (@{$nick_data->{$nick}{'longterm'}}) { my $num = scalar (@{$nick_data->{$nick}{'longterm'}}); $LongtermDays = $num if ($LongtermDays > $num); for (my $i = $num - $LongtermDays; $i < $num; $i++) { my $ptr = $nick_data->{$nick}{'longterm'}[$i]; for (my $j = 0; $j < 4; $j++) { $max_longterm = $ptr->[$j] if ($max_longterm < $ptr->[$j]); } } } } print $fh qq#\n#, qq# \n#, qq# \n#, qq# \n#; for (@nicks) { my $nick = $_; my $name = nick_to_name ($nick); my $print = $name ? $name : $nick; my $ptr = $nick_data->{$nick}; print $fh qq# \n#, qq# \n#, qq# \n#, qq# \n#; if ($DisplayImages) { my $link = get_link ($name); my $image = get_image ($name); if ($DefaultImage and !$image) { $image = $DefaultImage; } print $fh qq# \n"; } print $fh qq# \n \n EOF for (my $i = 0; $i < $ConversationsNumber and $i < scalar (@others); $i++) { my $other = $others[$i]; my $other_name = nick_to_name ($other) || $other; my $total = 0; print $fh " \n", qq# \n#, qq# \n \n"; } print $fh "
$trans
$print
#; if ($image) { if ($link) { print $fh qq##; } print $fh qq#$print#; if ($link) { print $fh ""; } } else { print $fh ' '; } print $fh "\n#; { my $lines; my $words; my $chars; $lines = $ptr->{'lines_total'}; $trans = translate ('Has written %u lines'); printf $fh (" $trans
\n", $lines); $words = $ptr->{'words_total'}; $trans = translate ('Has written %u words'); printf $fh (" $trans
\n", $words); $chars = $ptr->{'chars_total'}; $trans = translate ('Has written %u chars'); printf $fh (" $trans
\n", $chars); $lines ||= 1; $num = $words / $lines; $trans = translate ('Has written %.1f words per line'); printf $fh (" $trans
\n", $num); $num = $chars / $lines; $trans = translate ('Has written %.1f characters per line'); printf $fh (" $trans
\n", $num); } print $fh qq#
\n#; if (%{$ptr->{'interestingnumbers'}}) { $trans = translate ('Has given %u ops'); printf $fh (" $trans
\n", $ptr->{'interestingnumbers'}{'op_given'}); $trans = translate ('Has taken %u ops'); printf $fh (" $trans
\n", $ptr->{'interestingnumbers'}{'op_taken'}); $trans = translate ('Has kicked out %u people'); printf $fh (" $trans
\n", $ptr->{'interestingnumbers'}{'kick_given'}); $trans = translate ('Has been kicked out %u times'); printf $fh (" $trans
\n", $ptr->{'interestingnumbers'}{'kick_received'}); $trans = translate ('Has performed %u actions'); printf $fh (" $trans
\n", $ptr->{'interestingnumbers'}{'actions'}); } if (%{$ptr->{'bignumbers'}}) { $num = 100 * $ptr->{'bignumbers'}{'questions'} / $ptr->{'lines_total'}; $trans = translate ("Question ratio: %.1f%%"); printf $fh (" $trans
\n", $num); $num = 100 * $ptr->{'bignumbers'}{'uppercase'} / $ptr->{'lines_total'}; $trans = translate ("Uppercase ratio: %.1f%%"); printf $fh (" $trans
\n", $num); $num = 100 * $ptr->{'bignumbers'}{'smiley_happy'} / $ptr->{'lines_total'}; $trans = translate ("Happy smiley ratio: %.1f%%"); printf $fh (" $trans
\n", $num); $num = 100 * $ptr->{'bignumbers'}{'smiley_sad'} / $ptr->{'lines_total'}; $trans = translate ("Sad smiley ratio: %.1f%%"); printf $fh (" $trans
\n", $num); } print $fh qq#
\n#; if (%{$ptr->{'conversations'}}) { my $i; my @others = sort { ($ptr->{'conversations'}{$b}{'nicks'}{$nick}[0] + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[1] + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[2] + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[3]) <=> ($ptr->{'conversations'}{$a}{'nicks'}{$nick}[0] + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[1] + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[2] + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[3]) } (keys %{$ptr->{'conversations'}}); $trans = translate ('Talks to'); print $fh <
$trans:
$other_name#; for (my $k = 0; $k < 4; $k++) { my $img = $HorizontalImages[$k]; my $num = $ptr->{'conversations'}{$other}{'nicks'}{$nick}[$k]; my $width = sprintf ("%.2f", 95 * $num / $max_conv); print $fh qq##; } print $fh "
\n"; } else { print $fh ' '; } print $fh qq# \n \n#, qq# \n \n#; if (defined ($ptr->{'chars'})) { print $fh qq# \n \n#; for (my $i = 0; $i < 24; $i++) { $num = 0; my $img = $VerticalImages[int ($i / 6)]; my $height; $num = $ptr->{'chars'}[$i]; $height = sprintf ("%.2f", 95 * $num / $max_time); print $fh qq# \n#; } print $fh <
$num chars
0-5 6-11 12-17 18-23
EOF } else { print $fh "  \n"; } print $fh qq# \n \n#; #weekly if (%{$nick_data->{$nick}{'weekdays'}}) { my $data = $nick_data->{$nick}{'weekdays'}; my @days = (qw(mon tue wed thu fri sat sun)); print $fh qq# \n#, qq# \n#; for (@days) { my $day = $_; for (my $i = 0; $i < 4; $i++) { my $num = $nick_data->{$nick}{'weekdays'}{$day}[$i]; my $height = sprintf ("%.2f", 95 * $num / $max_weekdays); my $img = $VerticalImages[$i]; print $fh qq# \n#; } } print $fh qq# \n#, qq# \n#; for (@days) { my $day = $_; my $trans = translate ($day); print $fh qq# \n#; } print $fh qq# \n#, qq#
#, qq##, qq#
$trans
\n#; } else { print $fh "  \n"; } print $fh qq# \n \n#; #longterm if (@{$nick_data->{$nick}{'longterm'}}) { my $num_fields = scalar (@{$nick_data->{$nick}{'longterm'}}); my $now_epoch = get_most_recent_time (); my $now_day = int ($now_epoch / 86400); my $last_day; my @weekdays = (qw(sun mon tue wed thu fri sat)); $LongtermDays = $num_fields if ($LongtermDays > $num_fields); $last_day = 1 + $now_day - $LongtermDays; print $fh qq# \n#, qq# \n#; for (my $i = $num_fields - $LongtermDays; $i < $num_fields; $i++) { for (my $j = 0; $j < 4; $j++) { my $num = $nick_data->{$nick}{'longterm'}[$i][$j]; my $height = sprintf ("%.2f", 95 * $num / $max_longterm); my $img = $VerticalImages[$j]; print $fh qq# \n#; } } print $fh qq# \n#, qq# \n#; for (my $i = 0; $i < $LongtermDays; $i++) { my $epoch = ($last_day + $i) * 86400; my ($day, $wd) = (localtime ($epoch))[3,6]; $wd = $weekdays[$wd]; print $fh qq# \n#; } print $fh qq# \n#, qq#
#, qq##, qq#
$day.
\n#; } else { print $fh "  \n"; } print $fh qq# \n \n#; } print $fh "\n\n"; }