############################################################################### # Settings_ExtendedProfiles.pm # # $Date: 01 Sep 2026 $ # ############################################################################### # YaBB: Yet another Bulletin Board # # Version: YaBBForum 3.2 # # Packaged: 01 Sep 2026 # # Distributed by: https://yabbforum.nz # # =========================================================================== # # Copyright (c) 2000-2026 YaBB (yabbforum.nz) - 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 = '3.2'; $settings_extendedprofilespmver = 'YaBBForum 3.2'; 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{} ) { $value = ext_timeformat($value); } 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{\Ahttps://}sm ) { $value = "https://$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{\Ahttps://}sm ) { $value = "https://$value"; } $value = qq~q{}~; } } return $value; } 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; } # formats a MM/DD/YYYY string to the user's preferred format, ignores time completely! sub ext_timeformat { my ( $mytimeselected, $oldformat, $mytimeformat, $newday, $newday2, $newmonth, $newmonth2, $newyear, $newshortyear, $oldmonth, $oldday, $oldyear, $newweekday, $newyearday, $newweek, $dummy, $usefullmonth ); if ( ${ $uid . $username }{'timeselect'} > 0 ) { $mytimeselected = ${ $uid . $username }{'timeselect'}; } else { $mytimeselected = $timeselected; } $oldformat = shift; if ( $oldformat eq q{} || $oldformat eq "\n" ) { return $oldformat; } $oldmonth = substr $oldformat, 0, 2; $oldday = substr $oldformat, 3, 2; $oldyear = substr $oldformat, 6, 4; if ( $oldformat ne q{} ) { $newday = $oldday + 0; $newmonth = $oldmonth + 0; $newyear = $oldyear + 0; $newshortyear = substr $newyear, 2, 2; if ( $newmonth < 10 ) { $newmonth = "0$newmonth"; } if ( $newday < 10 && $mytimeselected != 4 ) { $newday = "0$newday"; } if ( $mytimeselected == 1 ) { qq~$newmonth/$newday/$newshortyear~; } elsif ( $mytimeselected == 2 ) { $newformat = qq~$newday.$newmonth.$newshortyear~; return $newformat; } elsif ( $mytimeselected == 3 ) { $newformat = qq~$newday.$newmonth.$newyear~; return $newformat; } elsif ( $mytimeselected == 4 || $mytimeselected == 8 ) { $newmonth--; $newmonth2 = $months[$newmonth]; if ( $newday > 10 && $newday < 20 ) { $newday2 = "$timetxt{'4'}"; } elsif ( $newday % 10 == 1 ) { $newday2 = "$timetxt{'1'}"; } elsif ( $newday % 10 == 2 ) { $newday2 = "$timetxt{'2'}"; } elsif ( $newday % 10 == 3 ) { $newday2 = "$timetxt{'3'}"; } else { $newday2 = "$timetxt{'4'}"; } $newformat = qq~$newmonth2 $newday$newday2, $newyear~; return $newformat; } elsif ( $mytimeselected == 5 ) { $newformat = qq~$newmonth/$newday/$newshortyear~; return $newformat; } elsif ( $mytimeselected == 6 ) { $newmonth2 = $months[ $newmonth - 1 ]; $newformat = qq~$newday. $newmonth2 $newyear~; return $newformat; } elsif ( $mytimeselected == 7 ) { ( $dummy, $dummy, $dummy, $dummy, $dummy, $dummy, $newweekday, $newyearday, $dummy ) = gmtime $oldformat; $newweek = int( ( $newyearday + 1 - $newweekday ) / 7 ) + 1; $mytimeformat = ${ $uid . $username }{'timeformat'}; if ( $mytimeformat =~ m/MM/sm ) { $usefullmonth = 1; } $mytimeformat =~ s/(?:\s)*\@(?:\s)*//gxsm; $mytimeformat =~ s/HH(?:\s)?//gxsm; $mytimeformat =~ s/mm(?:\s)?//gxsm; $mytimeformat =~ s/ss(?:\s)?//gxsm; $mytimeformat =~ s/://gxsm; $mytimeformat =~ s/ww(?:\s)?//gxsm; $mytimeformat =~ s/(.*?)(?:\s)*$/$1/gxsm; if ( $mytimeformat =~ m/\+/sm ) { if ( $newday > 10 && $newday < 20 ) { $dayext = "$timetxt{'4'}"; } elsif ( $newday % 10 == 1 ) { $dayext = "$timetxt{'1'}"; } elsif ( $newday % 10 == 2 ) { $dayext = "$timetxt{'2'}"; } elsif ( $newday % 10 == 3 ) { $dayext = "$timetxt{'3'}"; } else { $dayext = "$timetxt{'4'}"; } } $mytimeformat =~ s/YYYY/$newyear/gxsm; $mytimeformat =~ s/YY/$newshortyear/gxsm; $mytimeformat =~ s/DD/$newday/gxsm; $mytimeformat =~ s/D/$newday/gxsm; $mytimeformat =~ s/\+/$dayext/gxsm; if ( $usefullmonth == 1 ) { $mytimeformat =~ s/MM/$months[$newmonth-1]/gxsm; } else { $mytimeformat =~ s/M/$newmonth/gxsm; } $mytimeformat =~ s/\*//gxsm; return $mytimeformat; } } else { return q{}; } #no return; } # returns the output for the Extended Profile Controls in admin center sub ext_admin { my ( $id, $output, $fieldname, @options, $active, @selected, @contents ); is_admin_or_gmod(); $yymain .= qq~
$admin_img{'profile'} $lang_ext{'Profiles_Controls'}
$lang_ext{'admin_description'}
$admin_img{'profile'} $lang_ext{'edit_title'}
$lang_ext{'edit_description'}
~; if ( !@ext_prof_order ) { $yymain .= qq~
$lang_ext{'active'} $lang_ext{'field_name'} $lang_ext{'field_type'} $lang_ext{'actions'}
$lang_ext{'no_additional_fields_set'}
~; } else { $yymain .= q~
~; foreach my $fieldname (@ext_prof_order) { $id = ext_get_field_id($fieldname); ext_get_field($id); my @typelist = qw( text text_multi select radiobuttons checkbox date email url spacer image ); foreach my $i (0 .. 9) { if ($field{'type'} eq $typelist[$i]) { $selected[$i] = ' selected="selected"'; } else { $selected[$i] = q{}; } } if ( $field{'active'} == 1 ) { $active = ' checked="checked"'; } else { $active = q{}; } $yymain .= qq~
~; } } $yymain .= qq~
$admin_img{'profile'} $lang_ext{'create_new_title'}
$lang_ext{'create_new_description'}
$lang_ext{'actions'}
$admin_img{'profile'} $lang_ext{'reorder_title'}
$lang_ext{'reorder_description'}

~; if ( -e "$vardir/Extended.lock" ) { $yymain .= FoundExtLock();} else { if ( -e "$vardir/ConvSettings.txt" ) { require "$vardir/ConvSettings.txt"; } else { $convmemberdir = "$boarddir/Convert/Members"; $convvardir = "$boarddir/Convert/Variables"; } $yymain .= qq~
$lang_ext{'converter_title'}
$lang_ext{'converter_description'}







~; } $yytitle = $lang_ext{'Profiles_Controls'}; $action_area = 'ext_admin'; AdminTemplate(); return; } # reorders the fields as submitted sub ext_admin_reorder { is_admin_or_gmod(); $FORM{'reorder'} =~ tr/\r//d; $FORM{'reorder'} =~ s/\A[\s\n]+//xsm; $FORM{'reorder'} =~ s/[\s\n]+\Z//xsm; $FORM{'reorder'} =~ s/\n\s*\n/\n/gxsm; ToHTML( $FORM{'reorder'} ); @ext_prof_order = split /\n/xsm, $FORM{'reorder'}; require Admin::NewSettings; SaveSettingsTo('Settings.pm'); $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); return; } # creates a new field as submitted sub ext_admin_create { is_admin_or_gmod(); ToHTML( $FORM{'name'} ); push @ext_prof_order, $FORM{'name'}; push @ext_prof_fields, "$FORM{'name'}|$FORM{'type'}||1||0|1|||0|||0|0|||1|0|||0|0"; require Admin::NewSettings; SaveSettingsTo('Settings.pm'); $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); return; } # will generate us a nicely formated table row for the input form sub ext_admin_gen_inputfield { my ( $var1, $var2, $var3, $output ) = ( shift, shift, shift ); $output = qq~ $var1:
$var2 $var3 ~; return $output; } # generate html form option list depending on the passed groups string sub ext_admin_gen_groupslist { my ( $groups, $output, $groupid, @groups, %groupcheck ) = ( shift, q{} ); @groups = split /\s*\,\s*/xsm, $groups; foreach (@groups) { $groupcheck{$_} = ' selected="selected"'; } my @grps = ( 'Administrator','Global Moderator','Mid Moderator','Moderator',); my $output = q{}; foreach (@grps) { $output .= qq~\n~; } foreach ( sort { $a <=> $b } keys %NoPost ) { $groupid = $_; $output .= qq~\n~; } foreach ( reverse sort { $a <=> $b } keys %Post ) { $groupid = $_; $output .= qq~\n~; } return $output; } # performs all actions done in the edit profile field panel sub ext_admin_edit { @x = @_; my ( @fields, @order, $type, $active, $id, $name, $oldname, $req1, $req2, $req3, $v_check, $p_check, $p_d_check, $m_check, @editable_check, $is_numeric, $ubbc, @options, $check1, $check2, @contents, @old_content, $new_content, $output ); $oldname = $x[0]; is_admin_or_gmod(); if ( $FORM{'apply'} ne q{} ) { ToHTML( $FORM{'name'} ); $name = $FORM{'name'}; $id = $FORM{'id'}; $type = $FORM{'type'}; $active = $FORM{'active'} ne q{} ? 1 : 0; @fields = @ext_prof_fields; @_ = split /\|/xsm, $fields[ $FORM{'id'} ]; $fields[ $FORM{'id'} ] = "$name|$type|$x[2]|$active|$x[4]|$x[5]|$x[6]|$x[7]|$x[8]|$x[9]|$x[10]|$x[11]|$x[12]|$x[13]|$x[14]|$x[15]|$x[16]|$x[17]|$x[18]|$x[19]|$x[20]|$x[21]"; @ext_prof_fields = @fields; @order = @ext_prof_order; $id = 0; foreach (@order) { if ( $oldname eq $_ ) { $order[$id] = $name; last; } $id++; } @ext_prof_order = @order; require Admin::NewSettings; SaveSettingsTo('Settings.pm'); $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); } elsif ( $FORM{'options'} ne q{} ) { ext_get_field( $FORM{'id'} ); if ( $field{'active'} == 1 ) { $active = $lang_ext{'true'}; } else { $active = $lang_ext{'false'}; } if ( $field{'required_on_reg'} == 1 ) { $req1 = q{}; $req2 = ' checked="checked"'; $req3 = q{}; } elsif ( $field{'required_on_reg'} == 2 ) { $req1 = q{}; $req2 = q{}; $req3 = ' checked="checked"'; } else { $req1 = ' checked="checked"'; $req2 = q{}; $req3 = q{}; } if ( $field{'visible_in_viewprofile'} == 1 ) { $v_check = ' checked="checked"'; } else { $v_check = q{}; } if ( $field{'visible_in_posts'} == 1 ) { $p_check = ' checked="checked"'; } else { $p_check = q{}; } if ( $field{'visible_in_posts_popup'} == 1 ) { $pp_check = ' checked="checked"'; } else { $pp_check = q{}; } if ( $field{'p_displayfieldname'} == 1 ) { $p_d_check = ' checked="checked"'; } else { $p_d_check = q{}; } if ( $field{'pp_displayfieldname'} == 1 ) { $pp_d_check = ' checked="checked"'; } else { $pp_d_check = q{}; } if ( $field{'visible_in_memberlist'} == 1 ) { $m_check = ' checked="checked"'; } else { $m_check = q{}; } if ( $field{'radiounselect'} == 1 ) { $radiounselect = ' checked="checked"'; } else { $radiounselect = q{}; } $editable_check[ $field{'editable_by_user'} ] = ' selected="selected"'; $yymain .= qq~
$admin_img{'profile'} $lang_ext{'options_title'}
$lang_ext{'options_description'}
$lang_ext{'active'}: $active $lang_ext{'field_name'}: $field{'name'} $lang_ext{'field_type'}: $lang_ext{$field{'type'}} <-- $lang_ext{'change_these_settings'}
~; if ( $field{'type'} eq 'text' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[2] == 1 ) { $is_numeric = ' checked="checked"' } else { $is_numeric = q{} } if ( $options[4] == 1 ) { $ubbc = ' checked="checked"' } else { $ubbc = q{} } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } elsif ( $field{'type'} eq 'text_multi' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[3] == 1 ) { $ubbc = ' checked="checked"' } else { $ubbc = q{} } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } elsif ( $field{'type'} eq 'select' ) { @options = split /\^/xsm, $field{'options'}; $output = q{}; foreach (@options) { $output .= qq~$_\n~; } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } elsif ( $field{'type'} eq 'radiobuttons' ) { @options = split /\^/xsm, $field{'options'}; $output = q{}; foreach (@options) { $output .= qq~$_\n~; } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } elsif ( $field{'type'} eq 'spacer' ) { @options = split /\^/xsm, $field{'options'}; if ( $options[0] == 1 ) { $check2 = ' checked="checked"'; $check1 = q{}; } else { $check2 = q{}; $check1 = ' checked="checked"'; } if ( $options[1] == 1 ) { $options[1] = ' checked="checked"'; } else { $options[1] = q{}; } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~$lang_ext{'hr'}\n~ . qq~$lang_ext{'br'}~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } elsif ( $field{'type'} eq 'image' ) { @options = split /\^/xsm, $field{'options'}; #if ($options[3] == 1) { $ubbc = ' checked="checked"' } else { $ubbc = q{} } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ); } $yymain .= ext_admin_gen_inputfield( qq~~, qq~~, qq~~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~ $lang_ext{'req1'}
\n~ . qq~ $lang_ext{'req0'}
\n~ . qq~ $lang_ext{'req2'}\n~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~
\n~ . qq~
\n~ . qq~ \n~ . qq~ \n~ . qq~
\n~ . qq~ \n~ . qq~
\n~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~
\n~ . qq~\n~ . qq~ \n~ . qq~ \n~ . qq~ \n~ . qq~
\n~ . qq~ \n~ . qq~
\n~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~
\n~ . qq~\n~ . qq~ \n~ . qq~ \n~ . qq~ \n~ . qq~
\n~ . qq~ \n~ . qq~
\n~ ) . ext_admin_gen_inputfield( qq~~, qq~~, qq~
\n~ . qq~\n~ . qq~ \n~ . qq~ \n~ . qq~
\n~ . qq~ \n~ . qq~
\n~ ); if ( $field{'type'} ne 'spacer' ) { $yymain .= ext_admin_gen_inputfield( qq~\n ~, qq~\n ~, qq~\n \n~ ); } $yymain .= qq~
~; if ( $field{'type'} eq 'spacer' ) { $yymain .= q~ ~; } $yymain .= qq~
$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$lang_ext{'Profiles_Controls'} - $lang_ext{'options_title'}"; $action_area = 'ext_admin'; AdminTemplate(); } elsif ( $FORM{'delete'} ne q{} ) { $id = 0; ext_get_field( $FORM{'id'} ); @fields = @ext_prof_fields; @ext_prof_fields = (); foreach (@fields) { if ( $FORM{'id'} != $id ) { push @ext_prof_fields, $_; } $id++; } @order = @ext_prof_order; @ext_prof_order = (); foreach (@order) { if ( $_ ne $field{'name'} ) { push @ext_prof_order, $_; } } require Admin::NewSettings; SaveSettingsTo('Settings.pm'); opendir EXT_DIR, "$memberdir"; @contents = grep { /\.vars$/sm } readdir EXT_DIR; closedir EXT_DIR; foreach (@contents) { fopen( EXT_FILE, "+<$memberdir/$_" ) || fatal_error( 'cannot_open', "$memberdir/$_" ); seek EXT_FILE, 0, 0; @old_content = ; $new_content = join q{}, @old_content; $new_content =~ s/\n'ext_$FORM{'id'}',"(?:.*?)"\n/\n/igsm; seek EXT_FILE, 0, 0; truncate EXT_FILE, 0; print {EXT_FILE} $new_content or croak "$croak{'print'} EXT_FILE"; fclose(EXT_FILE); } $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); } else { $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); } return; } # modifies a field as submitted sub ext_admin_edit2 { my ( @fields, @options ); is_admin_or_gmod(); ToHTML( $FORM{'name'} ); ToHTML( $FORM{'comment'} ); if ( $FORM{'active'} eq q{} ) { $FORM{'active'} = 0; } if ( $FORM{'required_on_reg'} eq q{} ) { $FORM{'required_on_reg'} = 0; } if ( $FORM{'visible_in_viewprofile'} eq q{} ) { $FORM{'visible_in_viewprofile'} = 0; } if ( $FORM{'visible_in_posts'} eq q{} ) { $FORM{'visible_in_posts'} = 0; } if ( $FORM{'visible_in_posts_popup'} eq q{} ) { $FORM{'visible_in_posts_popup'} = 0; } if ( $FORM{'p_displayfieldname'} eq q{} ) { $FORM{'p_displayfieldname'} = 0; } if ( $FORM{'pp_displayfieldname'} eq q{} ) { $FORM{'pp_displayfieldname'} = 0; } if ( $FORM{'visible_in_memberlist'} eq q{} ) { $FORM{'visible_in_memberlist'} = 0; } if ( $FORM{'editable_by_user'} eq q{} ) { $FORM{'editable_by_user'} = 0; } $FORM{'v_users'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'v_groups'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'p_users'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'p_groups'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'pp_users'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'pp_groups'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'m_users'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'m_groups'} =~ s/^(\s)*(.+?)(\s)*$/$2/xsm; $FORM{'v_groups'} = join q{,}, split /\s*\,\s*/xsm, $FORM{'v_groups'}; $FORM{'p_groups'} = join q{,}, split /\s*\,\s*/xsm, $FORM{'p_groups'}; $FORM{'pp_groups'} = join q{,}, split /\s*\,\s*/xsm, $FORM{'pp_groups'}; $FORM{'m_groups'} = join q{,}, split /\s*\,\s*/xsm, $FORM{'m_groups'}; if ( $FORM{'type'} eq 'text' ) { if ( $FORM{'width'} == 0 ) { $FORM{'width'} = q{}; } if ( $FORM{'is_numeric'} eq q{} ) { $FORM{'is_numeric'} = 0; } if ( $FORM{'ubbc'} eq q{} ) { $FORM{'ubbc'} = 0; } $FORM{'options'} = "$FORM{'limit_len'}^$FORM{'width'}^$FORM{'is_numeric'}^$FORM{'default'}^$FORM{'ubbc'}"; } elsif ( $FORM{'type'} eq 'text_multi' ) { if ( $FORM{'rows'} == 0 ) { $FORM{'rows'} = q{}; } if ( $FORM{'cols'} == 0 ) { $FORM{'cols'} = q{}; } if ( $FORM{'ubbc'} eq q{} ) { $FORM{'ubbc'} = 0; } $FORM{'options'} = "$FORM{'limit_len'}^$FORM{'rows'}^$FORM{'cols'}^$FORM{'ubbc'}"; } elsif ( $FORM{'type'} eq 'select' ) { $FORM{'options'} =~ tr/\r//d; $FORM{'options'} =~ s/\A[\s\n]+/ \n/xsm; $FORM{'options'} =~ s/[\s\n]+\Z//xsm; $FORM{'options'} =~ s/\n\s*\n/\n/gxsm; @options = split /\n/xsm, $FORM{'options'}; $FORM{'options'} = q{}; foreach (@options) { $FORM{'options'} .= q{\^} . $_; } $FORM{'options'} =~ s/^\^//xsm; } elsif ( $FORM{'type'} eq 'radiobuttons' ) { $FORM{'options'} =~ tr/\r//d; $FORM{'options'} =~ s/\A[\s\n]+//xsm; $FORM{'options'} =~ s/[\s\n]+\Z//xsm; $FORM{'options'} =~ s/\n\s*\n/\n/gxsm; @options = split /\n/xsm, $FORM{'options'}; $FORM{'options'} = q{}; foreach (@options) { $FORM{'options'} .= q{\^} . $_; } $FORM{'options'} =~ s/^\^//xsm; if ( $FORM{'radiounselect'} eq q{} ) { $FORM{'radiounselect'} = 0; } } elsif ( $FORM{'type'} eq 'spacer' ) { if ( $FORM{'visible_in_editprofile'} eq q{} ) { $FORM{'visible_in_editprofile'} = 0; } $FORM{'options'} = "$FORM{'hr_or_br'}^$FORM{'visible_in_editprofile'}"; } elsif ( $FORM{'type'} eq 'image' ) { if ( $FORM{'image_width'} == 0 ) { $FORM{'image_width'} = q{}; } if ( $FORM{'image_height'} == 0 ) { $FORM{'image_height'} = q{}; } $FORM{'options'} = "$FORM{'image_width'}^$FORM{'image_height'}^$FORM{'allowed_extensions'}"; } @fields = @ext_prof_fields; $fields[ $FORM{'id'} ] = "$FORM{'name'}|$FORM{'type'}|$FORM{'options'}|$FORM{'active'}|$FORM{'comment'}|$FORM{'required_on_reg'}|$FORM{'visible_in_viewprofile'}|$FORM{'v_users'}|$FORM{'v_groups'}|$FORM{'visible_in_posts'}|$FORM{'p_users'}|$FORM{'p_groups'}|$FORM{'p_displayfieldname'}|$FORM{'visible_in_memberlist'}|$FORM{'m_users'}|$FORM{'m_groups'}|$FORM{'editable_by_user'}|$FORM{'visible_in_posts_popup'}|$FORM{'pp_users'}|$FORM{'pp_groups'}|$FORM{'pp_displayfieldname'}|$FORM{'radiounselect'}"; @ext_prof_fields = @fields; require Admin::NewSettings; SaveSettingsTo('Settings.pm'); $yySetLocation = qq~$adminurl?action=ext_admin~; redirectexit(); return; } # converts a user's .ext file to Y2 format sub ext_user_convert { my ( $pusername, $old_membersdir, @ext_profile, $id ) = ( shift, shift ); is_admin_or_gmod(); if ( -e "$old_membersdir/$pusername.ext" ) { if ( -e "$memberdir/$pusername.vars" ) { ext_get_profile($pusername); fopen( EXT_FILE, "$old_membersdir/$pusername.ext" ) || admin_fatal_error( 'cannot_open', "$old_membersdir/$pusername.ext" ); @ext_profile = ; fclose(EXT_FILE); chomp @ext_profile; $id = 0; foreach (@ext_prof_fields) { ${ $uid . $pusername }{ 'ext_' . $id } = $ext_profile[$id]; $id++; } UserAccount( $pusername, 'update' ); # don't delete old .ext files anymore, user can do that himself now. #unlink "$old_membersdir/$pusername.ext"; } } return; } # convert a string of usergroup names from the old YaBB format into Y2's new format sub ext_admin_convert_fixgroupnames { my ( $input, $done, $j, @groups, $group, $groupid, %checkdoubles ) = ( shift, 0 ); @groups = split /\s*\,\s*/xsm, $input; for my $j ( 0 .. ( @groups - 1 ) ) { # if groupname is in old format if ( $groups[$j] ne 'Administrator' && $groups[$j] ne 'Global Moderator' && $groups[$j] ne 'Moderator' && $groups[$j] !~ m/^(?:No)?Post\{\d+}$/sm ) { # find best matching usergroup foreach my $groupid ( sort { $a <=> $b } keys %NoPost ) { if ( $groups[$j] eq ( split /\|/xsm, ( split /\|/xsm, $NoPost{$groupid} )[0] ) [0] ) { $groups[$j] = "NoPost{$groupid}"; # check for doubles if ( $checkdoubles{ $groups[$j] } == 1 ) { splice @groups, $j, 1; $j--; $done = 1; last; } else { $checkdoubles{ $groups[$j] } = 1; } } } if ( $done == 1 ) { $done = 0; next; } foreach my $groupid ( reverse sort { $a <=> $b } keys %Post ) { if ( $groups[$j] eq ( split /\|/xsm, ( split /\|/xsm, $Post{$groupid} )[0] )[0] ) { $groups[$j] = "Post{$groupid}"; # check for doubles if ( $checkdoubles{ $groups[$j] } == 1 ) { splice @groups, $j, 1; $done = 1; $j--; last; } else { $checkdoubles{ $groups[$j] } = 1; } } } if ( $done == 1 ) { $done = 0; next; } } else { $checkdoubles{ $groups[$j] } = 1; } # if still not matching, get rid of it! if ( $groups[$j] ne 'Administrator' && $groups[$j] ne 'Global Moderator' && $groups[$j] ne 'Moderator' && $groups[$j] !~ m/^(?:No)?Post\{\d+}$/sm ) { #delete $groups[$j]; splice @groups, $j, 1; $j--; } } join q{,}, @groups; return; } # converts ALL old .ext files into the the YaBB 2 file format sub ext_admin_convert { my ( @contents, $filename, $old_membersdir, $old_vardir, $i ); is_admin_or_gmod(); $old_membersdir = $FORM{'members'}; $old_vardir = $FORM{'vars'}; if ( !-e $old_vardir ) { admin_fatal_error( 'extended_profiles_convert', $lang_ext{'converter_missing_vars'} ); } if ( !-e "$old_vardir/extended_profiles_order.txt" ) { admin_fatal_error( 'extended_profiles_convert', $lang_ext{'converter_missing_order'} ); } if ( !-e "$old_vardir/extended_profiles_fields.txt" ) { admin_fatal_error( 'extended_profiles_convert', $lang_ext{'converter_missing_fields'} ); } fopen( CONVERTER, "$old_vardir/extended_profiles_order.txt" ) || admin_fatal_error( 'cannot_open', "$old_vardir/extended_profiles_order.txt" ); @ext_prof_order = ; fclose(CONVERTER); chomp @ext_prof_order; # copy old extended_profiles_fields and extended_profiles_order files fopen( CONVERTER, "$old_vardir/extended_profiles_fields.txt" ) || admin_fatal_error( 'cannot_open', "$old_vardir/extended_profiles_fields.txt" ); @ext_prof_fields = ; fclose(CONVERTER); chomp @ext_prof_fields; #check if used membergroups still exist + convert to YaBB new format for my $i ( 0 .. ( @ext_prof_fields - 1 ) ) { my @field = split /\|/xsm, $ext_prof_fields[$i]; $field[8] = ext_admin_convert_fixgroupnames( $field[8] ); $field[11] = ext_admin_convert_fixgroupnames( $field[11] ); $field[15] = ext_admin_convert_fixgroupnames( $field[15] ); $field[19] = ext_admin_convert_fixgroupnames( $field[19] ); $ext_prof_fields[$i] = join q{|}, @field; } require Admin::NewSettings; SaveSettingsTo('Settings.pm'); opendir EXT_DIR, "$old_membersdir"; @contents = grep { /\.ext$/xsm } readdir EXT_DIR; closedir EXT_DIR; foreach my $filename (@contents) { $filename =~ s/.ext$//xsm; ext_user_convert( $filename, $old_membersdir ); } $yymain .= $lang_ext{'converter_succeeded'}; CreateExtLock(); $yytitle = "$lang_ext{'Profiles_Controls'} - $lang_ext{'options_title'}"; $action_area = 'ext_admin'; AdminTemplate(); return; } sub ext_viewprofile_r { my ( $pusername, @ext_profile, $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 ); if ( $field{'required_on_reg'} == 1 ) { if ( $output eq q{} && $previous != 1 ) { $pre_output = q~ ~; $previous = 1; } # format the output dependent 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~ $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 .= q~ ~; if ( $field{'comment'} ne q{} ) { $output .= qq~ $admin_img{'profile'}  $field{'comment'} ~; } else { $output .= q~ ~; } $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; } sub CreateExtLock { fopen( LOCKFILE, ">$vardir/Extended.lock" ) || setup_fatal_error( "$maintext_23 $vardir/Extended.lock: ", 1 ); print {LOCKFILE} qq~This is a lockfile for the Extended Profiles.\n~ or croak 'cannot print to LOCKFILE'; print {LOCKFILE} qq~It prevents it being run again after it has been run once.\n~ or croak 'cannot print to LOCKFILE'; print {LOCKFILE} q~Delete this file if you want to run the Converter again.~ or croak 'cannot print to LOCKFILE'; fclose(LOCKFILE); return; } sub FoundExtLock { $found = qq~
$lang_ext{'convlock'}
$lang_ext{'convlock_desc'}
~; return $found; } 1; # file formats used by this code: # # username.vars - contains the additional user profile information. Number is field-id # ------------- # ... # 'ext_0',"value" # 'ext_1',"value" # 'ext_2',"value" # ... # # @ext_prof_order - contains the order in which the fields will be displayed # --------------------------- # ("name","name","name",....) # # extended_profiles_fields.txt - defines the new profile fields. Uses line number as field-id # ---------------------------- # ("name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname","name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname","name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname",....) # # Here are all types with their possible type-specific options. If options contain multiple entries, separated by ^ # - text limit_len^width^is_numberic^default_value^allow_ubbc # - text_multi limit_len^rows^cols^allow_ubbc # - select option1^option2^option3... (first option is default) # - radiobuttons option1^option2^option3... (first option is default) # - spacer br_or_hr^visible_in_editprofile # - checkbox - # - date - # - emial - # - url - # - image width^height^allowed_extensions # # required_on_reg can have value 0 (disabled), 1 (required on registration) and 2 (not req. but display on reg. page anyway) # editable_by_user can have value 0 (will only show on the "admin edits" page), 1 ("edit profile" page), 2 ("contact information" page), 3 ("Options" page) and 4 ("PM Preferences" page) # allowed_extensions is a space-seperated list of file extensions, example: "jpg jpeg gif bmp png" # v_groups, p_groups, m_groups, pp_groups format: "Administrator" or "Moderator" or "Global Moderator" or NoPost{...} or Post{...} # # NOTE: use prefix "ext_" in sub-, variable- and formnames to prevent conflicts with other mods # # easy mod integration: use &ext_get($username,"fieldname") go get user's field value # ###############################################################################