############################################################################### # ExtendedProfiles.pm # # $Date: 01.05.16 $ # ############################################################################### # YaBB: Yet another Bulletin Board # # Version: YaBB 2.6.12 # # Packaged: January 5, 2016 # # Distributed by: http://www.yabbforumsoftware.com # # =========================================================================== # # Copyright (c) 2000-2016 YaBB (www.yabbforumsoftware.com) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### # This file was part of the Extended Profiles Mod which has been created by # # Michael Prager. Last modification by him: 15.11.07 # # Added to the YaBB default code on 07. September 2008 # ############################################################################### our $VERSION = '2.6.12'; $extendedprofilespmver = 'YaBB 2.6.12 $Revision: 1914 $'; if ( $action eq 'detailedversion' ) { return 1; } LoadLanguage('ExtendedProfiles'); $ext_spacer_hr = q~
~; $ext_spacer_br = q~
~; $ext_max_email_length = 60; $ext_max_url_length = 100; $ext_max_image_length = 100; my %field; # outputs the value of a user's extended profile field ## USAGE: $value = ext_get("admin","my_custom_fieldname"); ## or $value_raw = ext_get("admin","my_custom_fieldname",1); ## pass the third argument if you want to get the raw content e.g. an unformatted date sub ext_get { my ( $pusername, $fieldname, $no_parse, @ext_profile, @options, $field, $id, $value, $width, $height, @allowed_extensions, $extension, $match ) = ( shift, shift, shift ); ext_get_profile($pusername); $id = ext_get_field_id($fieldname); $value = ${ $uid . $pusername }{ 'ext_' . $id }; if ( $no_parse eq q{} || $no_parse == 0 ) { $field = ext_get_field($id); if ( $field{'type'} eq 'text' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[3] ne q{} && $value eq q{} ) { $value = $options[3]; } if ( $options[4] == 1 ) { $value = ext_parse_ubbc( $value, $pusername ); } } elsif ( $field{'type'} eq 'text_multi' && $value ne q{} ) { @options = split /\^/xsm, $field{'options'}; if ( $options[3] == 1 ) { $value = ext_parse_ubbc( $value, $pusername ); } } elsif ( $field{'type'} eq 'select' ) { @options = split /\^/xsm, $field{'options'}; if ( $value > $#options || $value eq q{} ) { $value = 0; } $value = $options[$value]; } elsif ( $field{'type'} eq 'radiobuttons' ) { @options = split /\^/xsm, $field{'options'}; if ( $value > $#options ) { $value = 0; } if ( !$field{'radiounselect'} && $value eq q{} ) { $value = 0; } if ( $value ne q{} ) { $value = $options[$value]; } } elsif ( $field{'type'} eq 'date' && $value ne q{} ) { @mytime = split /\//xsm, $value; $mytime = timelocal(0,0,0, $mytime[1],$mytime[0]-1,$mytime[2]); $mytime = timeformatcal($mytime); $value = dtonly ($mytime); } elsif ( $field{'type'} eq 'checkbox' ) { if ( $value == 1 ) { $value = $lang_ext{'true'} } else { $value = $lang_ext{'false'} } } elsif ( $field{'type'} eq 'spacer' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[0] == 1 ) { $value = qq~$ext_spacer_br~; } else { $value = qq~$ext_spacer_hr~; } } elsif ( $field{'type'} eq 'url' && $value ne q{} ) { if ( $value !~ m{\Ahttp://}sm ) { $value = "http://$value"; } } elsif ( $field{'type'} eq 'image' && $value ne q{} ) { @options = split /\^/xsm, $field{'options'}; if ( $options[2] ne q{} ) { @allowed_extensions = split /\ /xsm, $options[2]; $match = 0; foreach my $extension (@allowed_extensions) { if ( grep { /$extension$/ism } $value ) { $match = 1; last; } } if ( $match == 0 ) { return q{}; } } if ( $options[0] ne q{} && $options[0] != 0 ) { $width = q~ width="~ . ( $options[0] + 0 ) . q~"~; } else { $width = q{}; } if ( $options[1] ne q{} && $options[1] != 0 ) { $height = q~ height="~ . ( $options[1] + 0 ) . q~"~; } else { $height = q{}; } if ( $value !~ m{\Ahttp://}sm ) { $value = "http://$value"; } $value = qq~q{}~; } } return $value; } # loads the (extended) profile of a user sub ext_get_profile { LoadUser(shift); return; } # returns an array of the form qw(ext_0 ext_1 ext_2 ...) sub ext_get_fields_array { my ( $count, @result ) = (0); foreach (@ext_prof_fields) { push @result, "ext_$count"; $count++; } return @result; } # returns the id of a field through the fieldname sub ext_get_field_id { my ( $fieldname, $count, $id, $current, $currentname, $dummy ) = ( shift, 0 ); foreach my $current (@ext_prof_fields) { ( $currentname, $dummy ) = split /\|/xsm, $current; if ( $currentname eq $fieldname ) { $id = $count; last; } $count++; } return $id; } # returns all settings of a specific field sub ext_get_field { $field{'id'} = shift; ( $field{'name'}, $field{'type'}, $field{'options'}, $field{'active'}, $field{'comment'}, $field{'required_on_reg'}, $field{'visible_in_viewprofile'}, $field{'v_users'}, $field{'v_groups'}, $field{'visible_in_posts'}, $field{'p_users'}, $field{'p_groups'}, $field{'p_displayfieldname'}, $field{'visible_in_memberlist'}, $field{'m_users'}, $field{'m_groups'}, $field{'editable_by_user'}, $field{'visible_in_posts_popup'}, $field{'pp_users'}, $field{'pp_groups'}, $field{'pp_displayfieldname'}, $field{'radiounselect'}, undef ) = split /\|/xsm, $ext_prof_fields[ $field{'id'} ]; return; } # returns whenever the current user is allowed to view a field or not sub ext_has_access { my ( $allowed_users, $allowed_groups, $access, $usergroup, $useraddgroup, $postcount, $user, @users, $group, @groups, $groupid, $postamount ) = ( shift, shift, 0, ${ $uid . $username }{'position'}, ${ $uid . $username }{'addgroups'}, ${ $uid . $username }{'postcount'}, undef, ); if ( ( $allowed_users ne q{} ) || ( $allowed_groups ne q{} ) ) { if ( $allowed_users ne q{} ) { @users = split /\,/xsm, $allowed_users; foreach my $user (@users) { if ( $user eq $username ) { $access = 1; return $access; } } } if ( $allowed_groups ne q{} ) { # generate list of allowed groups # example: @groups = ('Administrator', 'Moderator', 'Global Moderator', 'Post{-1}', 'NoPost{1}'); @groups = split /\s*\,\s*/xsm, $allowed_groups; for my $group (@groups) { # check if user is in one of these groups if ( $group eq 'Administrator' || $group eq 'Moderator' || $group eq 'Mid Moderator' || $group eq 'Global Moderator' ) { if ( $group eq $usergroup ) { $access = 1; return $access; } } elsif ( $group =~ m/^NoPost\{(\d+)}$/sm ) { # check if user is on a post-independent group $groupid = $1; # check if group exists at all if ( exists $NoPost{$groupid} && $groupid ne q{} ) { # check if group id is in user position or addgroup field if ( $usergroup eq $groupid ) { $access = 1; return $access; } foreach my $group ( split /,/xsm, $useraddgroup ) { if ( $group eq $groupid ) { $access = 1; return $access; } } } } elsif ( $group =~ m/^Post\{(\d+)}$/sm ) { # check if user is in one of the post-depending groups... $groupid = $1; foreach my $postamount ( reverse sort { $a <=> $b } keys %Post ) { if ( $postcount > $postamount ) { # found the group the user is in if ( $postamount eq $groupid ) { $access = 1; return $access; } } } } } } } else { $access = 1; } return $access; } # applies UBBC code to a string sub ext_parse_ubbc { my ( $source, $displayname ) = @_; my $temp = $message; $message = $source; require Sources::YaBBC; $displayname = $pusername; # must be set for /me tag DoUBBC(); ToChars($message); $source = $message; $message = $temp; return $source; } # returns the output for the viewprofile page sub ext_viewprofile { my ( $pusername, @ext_profile, $field, $id, $output, $fieldname, @options, $value, $previous, $count, $last_field_id, $pre_output ) = (shift); if ( $#ext_prof_order > 0 ) { $last_field_id = ext_get_field_id( $ext_prof_order[-1] ); } foreach my $fieldname (@ext_prof_order) { $id = ext_get_field_id($fieldname); ext_get_field($id); $value = ext_get( $pusername, $fieldname ); # make sure the field is visible and the user allowed to view the current field if ( $field{'visible_in_viewprofile'} == 1 && $field{'active'} == 1 && ext_has_access( $field{'v_users'}, $field{'v_groups'} ) ) { if ( $output eq q{} && $previous != 1 ) { $pre_output = $ext_pre_output; $previous = 1; } # format the output dependend of the field type if ( ( $field{'type'} eq 'text' && $value ne q{} ) || ( $field{'type'} eq 'text_multi' && $value ne q{} ) || ( $field{'type'} eq 'select' && $value ne q{ } ) || ( $field{'type'} eq 'radiobuttons' && $value ne q{} ) || ( $field{'type'} eq 'date' && $value ne q{} ) || $field{'type'} eq 'checkbox' ) { $output .= qq~
$field{'name'}:
$value 
~; $previous = 0; } elsif ( $field{'type'} eq 'spacer' ) { # only print spacer if the previous entry was no spacer of the same type and if this is not the last entry if ( ( $previous == 0 || $field{'comment'} ne q{} ) && $id ne $last_field_id ) { if ( $value eq $ext_spacer_br ) { $output .= qq~
$ext_spacer_br
~; $previous = 0; } else { $output .= $ext_output_a; if ( $field{'comment'} ne q{} ) { $output .= $ext_output_c; } else { $output .= $ext_output_b; } $previous = 1; } } } elsif ( $field{'type'} eq 'email' && $value ne q{} ) { $output .= qq~
$field{'name'}:
~ . enc_eMail( $img_txt{'69'}, $value, q{}, q{} ) . q~
~; $previous = 0; } elsif ( $field{'type'} eq 'url' && $value ne q{} ) { $output .= qq~
$field{'name'}:
$value
~; $previous = 0; } elsif ( $field{'type'} eq 'image' && $value ne q{} ) { $output .= qq~
$field{'name'}:
$value
~; $previous = 0; } } } # only add spacer if there there is at least one field displayed if ( $output ne q{} ) { $output = $pre_output . $output . q~ ~; } return $output; } # returns the output for the post page sub ext_viewinposts { my ( $pusername, $popup, @ext_profile, $field, $id, $output, $fieldname, @options, $value, $previous, $pre_output, $visible, $users, $groups, $displayfieldname ) = ( shift, shift ); if ( $pusername ne 'Guest' ) { foreach my $fieldname (@ext_prof_order) { $id = ext_get_field_id($fieldname); $field = ext_get_field($id); $value = ext_get( $pusername, $fieldname ); if ( $popup ne q{} ) { $visible = $field{'visible_in_posts_popup'}; $users = $field{'pp_users'}; $groups = $field{'pp_groups'}; $displayfieldname = $field{'pp_displayfieldname'}; } else { $visible = $field{'visible_in_posts'}; $users = $field{'p_users'}; $groups = $field{'p_groups'}; $displayfieldname = $field{'p_displayfieldname'}; } # make sure the field is visible and the user allowed to view the current field if ( $visible == 1 && $field{'active'} == 1 && ext_has_access( $users, $groups ) ) { if ( $displayfieldname == 1 ) { $displayedfieldname = "$field{'name'}: "; } else { $displayedfieldname = q{}; } if ( $output eq q{} ) { $output = qq~$ext_spacer_br\n~; } # format the output depending on the field type if ( ( $field{'type'} eq 'text' && $value ne q{} ) || ( $field{'type'} eq 'text_multi' && $value ne q{} ) || ( $field{'type'} eq 'select' && $value ne q{ } ) || ( $field{'type'} eq 'radiobuttons' && $value ne q{} ) || ( $field{'type'} eq 'date' && $value ne q{} ) || $field{'type'} eq 'checkbox' ) { $output .= qq~$displayedfieldname$value
\n~; $previous = q{}; } elsif ( $field{'type'} eq 'spacer' ) { # those tags are required to keep the doc XHTML 1.0 valid if ( $previous ne "$value" ) { $previous = qq~$value~; $output .= $previous; } } elsif ( $field{'type'} eq 'email' && $value ne q{} ) { $output .= $displayedfieldname . enc_eMail( $img_txt{'69'}, $value, q{}, q{} ) . qq~
\n~; $previous = q{}; } elsif ( $field{'type'} eq 'url' && $value ne q{} ) { $output .= qq~$displayedfieldname$value
\n~; $previous = q{}; } elsif ( $field{'type'} eq 'image' && $value ne q{} ) { $output .= qq~$displayedfieldname$value
\n~; $previous = q{}; } } } } # check if there we have any output (except spacers) at all. If so, return empty output $pre_output = $output; $pre_output =~ s/(?:\<\/small>(?:(?:$ext_spacer_hr)|(?:$ext_spacer_br)))|\n|(?:\)//igsm; if ( $pre_output eq q{} ) { $output = q{}; } return $output; } { # we need a "static" variable to produce unique element ids my $ext_usercount = 0; # returns the output for the post page (popup box) sub ext_viewinposts_popup { my ( $pusername, $link, $output ) = ( shift, shift ); $output = ext_viewinposts( $pusername, 'popup' ); $output =~ s/^$ext_spacer_br\n//igxsm; if ( $output ne q{} ) { $link =~ s/$value~; } } if ( $value eq q{} ) { $value .= ' '; } $output .= $ext_memberlist_td; $output =~ s/{yabb ext_td_attributs}/$td_attributs/sm; $output =~ s/{yabb ext_value}/$value/sm; $count++; } } return $output; } # returns the edit mask of a field (used on registration and edit profile page) sub ext_gen_editfield { my ( $id, $pusername, @ext_profile, $output, $field, @options, $selected, $count, $required_prefix, $dayormonth, $dayormonthd, $dayormonthm, $value, $template1, $template2 ) = ( shift, shift ); LoadLanguage('Profile'); if ( $action eq 'register' ) { get_template('Register'); } else { get_template('MyProfile'); } $field = ext_get_field($id); # if username is omitted, we'll generate the code for the registration page if ( $pusername ne q{} ) { $value = ext_get( $pusername, $field{'name'}, 1 ); } FromHTML( $field{'comment'} ); $template1 = $ext_template1; $template1 =~ s/{yabb fieldname}/$field{'name'}/sm; $template1 =~ s/{yabb fieldcomment}/$field{'comment'}/sm; if ( $field{'required_on_reg'} == 1 ) { $template2 = $myreg_req; } $template2 .= $ext_endrow; # format the output depending on field type my $name_id = "ext_$id"; if ( $field{'type'} eq 'text' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[0] ne q{} ) { $options[0] = qq~ maxlength="$options[0]"~; } if ( $options[1] ne q{} ) { $options[1] = qq~ size="$options[1]"~; } if ( $options[3] ne q{} && $value eq q{} ) { $options[3] = qq~ value="$options[3]"~; } else { $options[3] = qq~ value="$value"~; } $output .= $template1 . qq~~ . $template2; } elsif ( $field{'type'} eq 'text_multi' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[0] ) { $field{'options'} = qq~
$lang_ext{'max_chars1'}$options[0]$lang_ext{'max_chars2'} ~; } else { $field{'options'} = q{}; } if ( $options[1] ne q{} ) { $options[1] = qq~ rows="$options[1]"~; } else { $options[1] = q~ rows="4"~; } if ( $options[2] ne q{} ) { $options[2] = qq~ cols="$options[2]"~; } else { $options[2] = q~ cols="50"~; } $value =~ s//\n/gm; $output .= $template1 . qq~$field{'options'}~ . $template2; } elsif ( $field{'type'} eq 'select' ) { $output .= $template1 . qq~~ . $template2; } elsif ( $field{'type'} eq 'radiobuttons' ) { $output .= $template1; @options = split /\^/xsm, $field{'options'}; if ( $value > $#options ) { $value = 0; } if ( !$field{'radiounselect'} && $value eq q{} ) { $value = 0; } $count = 0; foreach (@options) { if ( $value ne q{} && $count == $value ) { $selected = qq~ id="ext_$id" checked="checked"~; } else { $selected = q{}; } $output .= qq~$_\n~; $count++; } $output .= $template2; } elsif ( $field{'type'} eq 'date' ) { if ( $value !~ /[0-9\/]/sm ) { $value = q{}; } @options = split /\//xsm, $value; $dayormonthm = qq~ $profile_txt{'564'} ~; $dayormonthd = qq~ $profile_txt{'565'} ~; if ( ( ${ $uid . $pusername }{'timeselect'} == 2 || ${ $uid . $pusername }{'timeselect'} == 3 || ${ $uid . $pusername }{'timeselect'} == 6 ) || ( $timeselected == 2 || $timeselected == 3 || $timeselected == 6 ) ) { $dayormonth = $dayormonthd . $dayormonthm; $name_id = "ext_$id\_day"; } else { $dayormonth = $dayormonthm . $dayormonthd; $name_id = "ext_$id\_month"; } $output .= $template1 . qq~$dayormonth $profile_txt{'566'} ~ . $template2; } elsif ( $field{'type'} eq 'checkbox' ) { if ( $value == 1 ) { $value = ' checked="checked"'; } else { $value = q{}; } # we have to use a little trick here to get a value from a checkbox if it has been unchecked by adding a hidden before it $output .= $template1 . qq~~ . $template2; } elsif ( $field{'type'} eq 'spacer' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[1] == 1 ) { $output .= $ext_spacer; $output =~ s/{yabb fieldcomment}/$field{'comment'}/sm; } } elsif ( $field{'type'} eq 'email' ) { $output .= $template1 . qq~~ . $template2; } elsif ( $field{'type'} eq 'url' ) { $output .= $template1 . qq~~ . $template2; } elsif ( $field{'type'} eq 'image' ) { if ( $value eq q{} ) { $value = 'http://'; } $output .= $template1 . qq~~ . $template2; } $output =~ s/