Made Onis::Users consistent with new naming convention. Also it's documentation is...
authorocto <octo>
Sat, 9 Apr 2005 15:33:17 +0000 (15:33 +0000)
committerocto <octo>
Sat, 9 Apr 2005 15:33:17 +0000 (15:33 +0000)
lib/Onis/Data/Core.pm
lib/Onis/Users.pm [new file with mode: 0644]

index b15ba95..29a5b4b 100644 (file)
@@ -39,7 +39,7 @@ our $ChannelNames = Onis::Data::Persistent->new ('ChannelNames', 'channel', 'cou
 
 
 
 
 
 
-@Onis::Data::Core::EXPORT_OK = qw#all_nicks get_channel
+@Onis::Data::Core::EXPORT_OK = qw#get_all_nicks get_channel
        nick_to_ident
        ident_to_nick ident_to_name
        get_main_nick
        nick_to_ident
        ident_to_nick ident_to_name
        get_main_nick
@@ -55,7 +55,7 @@ our @AllNicks = ();
 our @ALLNAMES = ();
 our %NickMap = ();
 our %NickToIdent = ();
 our @ALLNAMES = ();
 our %NickMap = ();
 our %NickToIdent = ();
-our %IDENT2NICK = ();
+our %IdentToNick = ();
 our $LASTRUN_DAYS = 0;
 
 
 our $LASTRUN_DAYS = 0;
 
 
@@ -307,7 +307,7 @@ sub unsharp
 
 Iterates over all chatters found so far, trying to figure out which belong to
 the same person. This function has to be called before any calls to
 
 Iterates over all chatters found so far, trying to figure out which belong to
 the same person. This function has to be called before any calls to
-B<all_nicks>, B<get_main_nick>, B<get_print_name> and B<nick_to_ident>.
+B<get_all_nicks>, B<get_main_nick>, B<get_print_name> and B<nick_to_ident>.
 
 This is normally the step after having parsed all files and before doing any
 output. After this function has been run all the other informative functions
 
 This is normally the step after having parsed all files and before doing any
 output. After this function has been run all the other informative functions
@@ -341,6 +341,8 @@ sub calculate_nicks
 
                my $temp = $name ? $name : $ident;
 
 
                my $temp = $name ? $name : $ident;
 
+               next if (lc ($name) eq 'ignore');
+
                $nicks->{$nick}{$temp} = 0 unless (defined ($nicks->{$nick}{$temp}));
                $nicks->{$nick}{$temp} += $counter;
        }
                $nicks->{$nick}{$temp} = 0 unless (defined ($nicks->{$nick}{$temp}));
                $nicks->{$nick}{$temp} += $counter;
        }
@@ -424,20 +426,21 @@ sub calculate_nicks
                {
                        push (@AllNicks, $_);
                        $NickMap{$_} = $this_nick;
                {
                        push (@AllNicks, $_);
                        $NickMap{$_} = $this_nick;
+                       # FIXME
                        $NickToIdent{$_} = $this_ident;
                }
 
                        $NickToIdent{$_} = $this_ident;
                }
 
-               $IDENT2NICK{$this_ident} = $this_nick;
+               $IdentToNick{$this_ident} = $this_nick;
        }
 }
 
        }
 }
 
-=item I<@nicks> = B<all_nicks> ()
+=item I<@nicks> = B<get_all_nicks> ()
 
 Returns an array of all seen nicks.
 
 =cut
 
 
 Returns an array of all seen nicks.
 
 =cut
 
-sub all_nicks
+sub get_all_nicks
 {
        return (@AllNicks);
 }
 {
        return (@AllNicks);
 }
@@ -504,14 +507,11 @@ Returns the ident for this nick or an empty string if unknown.
 sub nick_to_ident
 {
        my $nick = shift;
 sub nick_to_ident
 {
        my $nick = shift;
-       if (defined ($NickToIdent{$nick}))
-       {
-               return ($NickToIdent{$nick});
-       }
-       else
-       {
-               return ('');
-       }
+
+       my ($ident) = $Nick2Ident->get ($nick);
+       $ident ||= '';
+
+       return ($ident);
 }
 
 =item I<$nick> = B<ident_to_nick> (I<$ident>)
 }
 
 =item I<$nick> = B<ident_to_nick> (I<$ident>)
@@ -530,9 +530,9 @@ sub ident_to_nick
        {
                return ('');
        }
        {
                return ('');
        }
-       elsif (defined ($IDENT2NICK{$ident}))
+       elsif (defined ($IdentToNick{$ident}))
        {
        {
-               return ($IDENT2NICK{$ident});
+               return ($IdentToNick{$ident});
        }
        else
        {
        }
        else
        {
@@ -711,7 +711,7 @@ Merges idents. Does magic, don't interfere ;)
 
 sub merge_idents
 {
 
 sub merge_idents
 {
-       my @idents = keys (%IDENT2NICK);
+       my @idents = keys (%IdentToNick);
 
        for (@idents)
        {
 
        for (@idents)
        {
diff --git a/lib/Onis/Users.pm b/lib/Onis/Users.pm
new file mode 100644 (file)
index 0000000..42f8cf7
--- /dev/null
@@ -0,0 +1,329 @@
+package Onis::Users;
+
+use strict;
+use warnings;
+use Exporter;
+use Onis::Config qw#get_config#;
+use Onis::Data::Core qw(nick_to_ident);
+use Onis::Data::Persistent;
+
+@Onis::Users::EXPORT_OK = qw#host_to_username nick_to_username get_link get_image get_realname#;
+@Onis::Users::ISA = ('Exporter');
+
+=head1 NAME
+
+Onis::Users - Management of configures users, so called "names".
+
+=head1 DESCRIPTION
+
+Parses user-info and provides query-routines. The definition of "name" can be found in L<Onis::Data::Core>.
+
+=head1 USAGE
+
+    use Onis::Users qw#ident_to_name chatter_to_name nick_to_name get_realname get_link get_image#;
+
+    # Functions to query the name
+    $name = ident_to_name ($ident);
+    $name = chatter_to_name ($chatter);
+    $name = nick_to_name ($nick);
+
+    # Functions to query a name's properties
+    my $realname  = get_realname ($name);
+    my $link      = get_link     ($name);
+    my $image     = get_image    ($name);
+
+=head1 DIAGNOSTIGS
+
+Set $::DEBUG to ``0x1000'' to get extra debug messages.
+
+=cut
+
+our $Users = {};
+# FIXME
+our $HostmaskCache = init ('$HostmaskCache', 'hash');
+
+my $VERSION = '$Id: Users.pm,v 1.2 2004/08/01 13:45:27 octo Exp $';
+print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
+
+read_config ();
+
+return (1);
+
+sub read_config
+{
+       my $config_file = 'users.conf';
+       my $content;
+       my $fh;
+       
+       if (get_config ('users_config'))
+       {
+               my $temp = get_config ('users_config');
+               if (-e $temp and -r $temp)
+               {
+                       $config_file = $temp;
+               }
+               elsif (-e $temp)
+               {
+                       print STDERR $/, __FILE__, ": Unable to read users_config ``$temp'': ",
+                               "File not readable. Check your permissions.";
+               }
+               else
+               {
+                       print STDERR $/, __FILE__, ": Unable to read users_config ``$temp'': ",
+                               "File does not exist.";
+               }
+       }
+
+       # Fail silently, if fle does not exist..
+       if (!-e $config_file) { return (0); }
+
+       print STDERR $/, __FILE__, ": Reading config file ``$config_file''" if ($::DEBUG & 0x1000);
+
+       # read the file
+       unless (open ($fh, "< $config_file"))
+       {
+               print STDERR $/, __FILE__, ": Unable to open ``$config_file'' for reading: $!";
+               return (0);
+       }
+
+       {
+               local ($/) = undef;
+               $content = <$fh>;
+       }
+
+       close ($fh);
+
+       # parse the file
+       #$content =~ s/[\n\r\s]+//gs;
+       $content =~ s/#.*$//gm;
+       $content =~ s/[\n\r]+//gs;
+       
+       #while ($content =~ m/([^{]+){([^}]+)}/g)
+       while ($content =~ m/([^\s{]+)\s*{([^}]+)}/g)
+       {
+               my $user = $1;
+               my $line = $2;
+
+               print STDERR $/, __FILE__, ": User ``$user''" if ($::DEBUG & 0x1000);
+
+               while ($line =~ m/([^\s:]+)\s*:([^;]+);/g)
+               {
+                       my $key = lc ($1);
+                       my $val = $2;
+                       $val =~ s/^\s+|\s+$//g;
+
+                       print STDERR $/, __FILE__, ": + $key = ``$val''" if ($::DEBUG & 0x1000);
+
+                       if (($key eq 'image') or ($key eq 'link')
+                                       or ($key eq 'name'))
+                       {
+                               if (!defined ($Users->{$user}{$key}))
+                               {
+                                       $Users->{$user}{$key} = [];
+                               }
+                               push (@{$Users->{$user}{$key}}, $val);
+                       }
+                       elsif (($key eq 'host') or ($key eq 'hostmask'))
+                       {
+                               my $this_nick;
+                               my $this_user;
+                               my $this_host;
+
+                               if ($val =~ m/^([^!]+)!([^@]+)@(.+)$/)
+                               {
+                                       $this_nick = quotemeta (lc ($1));
+                                       $this_user = quotemeta (lc ($2));
+                                       $this_host = quotemeta (lc ($3));
+                               }
+                               else
+                               {
+                                       print STDERR $/, __FILE__, ": Invalid hostmask for user $user: ``$val''";
+                                       next;
+                               }
+
+                               $this_nick =~ s/\\\*/[^!]*/g;
+                               $this_nick =~ s/\\\?/[^!]/g;
+
+                               $this_user =~ s/\\\*/[^@]*/g;
+                               $this_user =~ s/\\\?/[^@]/g;
+
+                               $this_host =~ s/\\\*/.*/g;
+                               $this_host =~ s/\\\?/./g;
+
+                               $val = "$this_nick!$this_user\@$this_host";
+
+                               if (!defined ($Users->{$user}{'host'}))
+                               {
+                                       $Users->{$user}{'host'} = [];
+                               }
+
+                               print STDERR " --> m/^$val\$/i" if ($::DEBUG & 0x1000);
+                               
+                               push (@{$Users->{$user}{'host'}}, qr/^$val$/i);
+                       }
+                       else
+                       {
+                               print STDERR $/, __FILE__, ": Invalid key in users_config: ``$key''";
+                       }
+               }
+
+               if (!defined ($Users->{$user}{'host'}))
+               {
+                       print STDERR $/, __FILE__, ": No hostmask given for user $user. Ignoring him/her.";
+                       delete ($Users->{$user});
+               }
+       }
+
+       return (1);
+}
+
+=head1 EXPORTED FUNCTIONS
+
+=over 4
+
+=item B<ident_to_name> (I<$ident>)
+
+Matches the ident against the configured hostmasks. Uses caching to
+speed up execution. Returns the name or an empty string if not found.
+
+=cut
+
+sub ident_to_name
+{
+       my $ident = shift;
+       my $name = '';
+
+       if (defined ($HostmaskCache->{$ident}))
+       {
+               $name = $HostmaskCache->{$ident};
+       }
+       else
+       {
+               USER: for (keys (%$Users))
+               {
+                       my $this_name = $_;
+                       for (@{$Users->{$this_name}{'host'}})
+                       {
+                               my $host_re = $_;
+
+                               if ($ident =~ $host_re)
+                               {
+                                       $name = $this_name;
+                                       last (USER);
+                               }
+                       }
+               }
+
+               if (($::DEBUG & 0x1000) and $name)
+               {
+                       print STDERR $/, __FILE__, ": Host ``$ident'' belongs to ``$name''";
+               }
+       }
+       
+       $HostmaskCache->{$ident} = $name;
+       return ($name);
+}
+
+=item B<chatter_to_name> (I<$chatter>)
+
+Passes the ident-part of I<$chatter> to B<ident_to_name>.
+
+=cut
+
+sub chatter_to_name
+{
+       my $chatter = shift;
+       my ($nick, $ident) = split (m/!/, $chatter);
+
+       return (ident_to_name ($ident));
+}
+
+=item B<nick_to_name> (I<$nick>)
+
+Return the name associated with I<$nick>. This function uses B<nick_to_ident>
+(see L<Onis::Data::Core>) to convert I<$nick> to an ident and then calls
+B<ident_to_name>.
+
+=cut
+
+sub nick_to_name
+{
+       my $nick = shift;
+       my $ident = nick_to_ident ($nick);
+
+       if ($ident)
+       {
+               return (ident_to_name ($ident));
+       }
+       else
+       {
+               return ('');
+       }
+}
+
+=item B<get_realname> (I<$name>)
+
+Returns the B<real name> for this (user)name as defined in the config. Sorry
+for the confusing terms.
+
+=cut
+
+sub get_realname
+{
+       my $name = shift;
+       my $retval = '';
+
+       if (defined ($Users->{$name}{'name'}))
+       {
+               my $tmp = int (rand (scalar (@{$Users->{$name}{'name'}})));
+               $retval = $Users->{$name}{'name'}[$tmp];
+       }
+
+       return ($retval);
+}
+
+=item B<get_link> (I<$name>)
+
+Returns the URL defined for this name in the config.
+
+=cut
+
+sub get_link
+{
+       my $name = shift;
+       my $retval = '';
+
+       if (defined ($Users->{$name}{'link'}))
+       {
+               my $tmp = int (rand (scalar (@{$Users->{$name}{'link'}})));
+               $retval = $Users->{$name}{'link'}[$tmp];
+       }
+
+       return ($retval);
+}
+
+=item B<get_image> (I<$name>)
+
+Returns the URL of the (user)name's image, if one is configured.
+
+=cut
+
+sub get_image
+{
+       my $name = shift;
+       my $retval = '';
+
+       if (defined ($Users->{$name}{'image'}))
+       {
+               my $tmp = int (rand (scalar (@{$Users->{$name}{'image'}})));
+               $retval = $Users->{$name}{'image'}[$tmp];
+       }
+
+       return ($retval);
+}
+
+=back
+
+=head1 AUTHOR
+
+Florian octo Forster E<lt>octo at verplant.orgE<gt>