name"); echo sanitize_html($team->name_html); start_table(); row1("Team info"); if (strlen($team->description)) { row2("Description", sanitize_html($team->description)); } if (strlen($team->url)) {; if (strstr($team->url, "http://")) { $x = $team->url; } else { $x = "http://$team->url"; } row2("Web site", "$x"); } row2("Members (with credit)", $team->nusers); $cache_args = "teamid=".$team->id."&founderid=".$team->userid; $cached_data = get_cached_data(TEAM_PAGE_TTL, $cache_args); if ($cached_data){ $founder = unserialize($cached_data); } else { $founder = lookup_user_id($team->userid); set_cache_data(serialize($founder),$cache_args); } $user = get_logged_in_user(false); row2("Total credit", format_credit($team->total_credit)); row2("Recent average credit", format_credit($team->expavg_credit)); row2("Founder", user_links($founder)); row2("Country", $team->country); row2("Type", team_type_name($team->type)); if ($user->teamid != $team->id) { row2("Join this team", "Join"); } if (($user->teamid == $team->id) && ($user->id != $founder->id)) { row2("Request team founder transfer", "Initiate transfer"); } echo ""; echo "

"; start_table(); row1("Active members (with credit)", 4); echo " Name "; if ($nosort) { echo " Total credit Recent average credit "; } else { if ($sort_by == "total_credit") { echo "Total credit"; } else { echo "id&sort_by=total_credit&offset=$offset>Total credit"; } if ($sort_by == "expavg_credit") { echo "Recent average credit"; } else { echo "id&sort_by=expavg_credit&offset=$offset>Recent average credit"; } } echo " Country "; if ($nosort) { $result = mysql_query("select * from user where teamid=$team->id and total_credit>0 limit $offset,$n"); } else { $result = mysql_query("select * from user where teamid=$team->id and total_credit>0 order by $sort_clause limit $offset,$n"); } $j = $offset + 1; while ($user = mysql_fetch_object($result)) { $user_total_credit = format_credit($user->total_credit); $user_expavg_credit = format_credit($user->expavg_credit); $x = user_links($user); echo " $j) $x $user_total_credit $user_expavg_credit $user->country "; $j++; } mysql_free_result($result); echo ""; if ($offset > 0) { $new_offset = $offset - $n; echo "id&sort_by=$sort_by&offset=$new_offset>Last $n | "; } if ($j == $offset + $n + 1) { $new_offset = $offset + $n; echo "id&sort_by=$sort_by&offset=$new_offset>Next $n"; } } // requires that the team exist function require_team($team) { if (!$team) { error_page("No such team."); } } // requires that the user is logged in as the founder of // the team trying to be edited // function require_founder_login($user, $team) { require_team($team); if ($user->id != $team->userid) { error_page("Only a team's founder may edit a team."); } } function team_table_start($sort_by,$type_url) { echo " ".tr(USER_TABLE_RANK)." ".tr(USER_TABLE_NAME)." ".tr(TEAM_TABLE_MEMBERS)." "; if ($sort_by == "total_credit") { echo " ".tr(EXPAVG_CREDIT)." ".tr(TOTAL_CREDIT)." "; } else { echo " ".tr(EXPAVG_CREDIT)." ".tr(TOTAL_CREDIT)." "; } echo " ".tr(USER_TABLE_COUNTRY)." "; } function show_team_row($team, $i) { $team_expavg_credit = format_credit($team->expavg_credit); $team_total_credit = format_credit($team->total_credit); echo" $i id>$team->name ".$team->nusers." $team_expavg_credit $team_total_credit $team->country \n"; } function user_join_team($team, $user) { $res = mysql_query("update user set teamid=$team->id where id=$user->id"); if ($res) { $now = time(); mysql_query("insert into team_delta (userid, teamid, timestamp, joining, total_credit) values ($user->id, $team->id, $now, 1, $user->total_credit)"); return true; } return false; } function user_quit_team($user) { if (!$user->teamid) return; mysql_query("update user set teamid=0 where id=$user->id"); mysql_query("update team set ping_user=0 where id=".$user->teamid." and ping_user=".$user->id); $now = time(); mysql_query("insert into team_delta (userid, teamid, timestamp, joining, total_credit) values ($user->id, $user->teamid, $now, 0, $user->total_credit)"); } function team_edit_form($team, $label, $url) { global $team_types; echo "

\n"; if ($team) { echo "id>\n"; } echo "

Privacy note: if you create a team, your project preferences (resource share, graphics preferences) will be visible to the public.

"; start_table(); row2( "Team name, text version
Don't use any HTML tags. This name will be used in the searchable team list.", "" ); row2("Team name, HTML version
You may include HTML formatting, link, and image tags. If you don't know HTML, just leave this box blank.", "name_html)."\">" ); row2("URL of team web page, if any:
(without \"http://\") This URL will be linked to from the team's page on this site.", "" ); row2("Description of team:", "" ); row2("Type of team:", team_type_select($team)); row2_init("Country", "\n"; row2("", "" ); end_table(); echo "\n"; } // decay a team's average credit // function team_decay_credit($team) { $avg = $team->expavg_credit; $avg_time = $team->expavg_time; $now = time(0); update_average($now, 0, 0, $avg, $avg_time); mysql_query("update team set expavg_credit=$avg, expavg_time=$now where id=$team->id"); } // if the team hasn't received new credit for ndays, // decay its average and return true // function team_inactive_ndays($team, $ndays) { $diff = time() - $team->expavg_time; if ($diff > $ndays*86400) { team_decay_credit($team); return true; } return false; } function team_count_nusers($teamid) { $res = mysql_query("select count(*) as total from user where teamid=$teamid and total_credit>0"); $cnt = mysql_fetch_object($res); if ($cnt) { return $cnt->total; } else { return null; } } // These functions determine the rules for foundership transfer, namely: // - A transfer request is allowed if either: // - there is no active request, and it's been at least 60 days // since the last request (this protects the founder from // being bombarded with frequest requests) // - there's an active request older than 90 days // (this lets a 2nd requester eventually get a chance) // - Suppose someone (X) requests foundership at time T. // An email is sent to the founder (Y). // The request is "active" (ping_user is set to X's ID) // - If Y declines the change, an email is sent to X, // and the request is cleared. // - If Y accepts the change, an email is sent to X // and the request is cleared. // - After T + 60 days, X can become founder // - After T + 90 days, new requests are allowed even if there's // an active request, i.e. after the 60 days elapse X has another // 30 days to assume foundership before someone elase can request it // function new_transfer_request_ok($team, $now) { if ($team->ping_user == 0) { if ($team->ping_time < $now - 60 * 86400) { return true; } return false; } if ($team->ping_time < $now - 90 * 86400) { return true; } return false; } function transfer_ok_time($team) { return $team->ping_time + 60*86400; } function transfer_ok($team, $now) { if ($now > transfer_ok_time($team)) return true; return false; } // Make a team; args are untrusted, so cleanse and validate them // function make_team( $userid, $name, $url, $type, $name_html, $description, $country ) { $name = boinc_htmlentities(process_user_text(strip_tags($name))); if (strlen($name) == 0) return null; $name_lc = strtolower($name); $url = process_user_text(strip_tags($url)); if (strstr($url, "http://")) { $url = substr($url, 7); } $name_html = process_user_text($name_html); $description = process_user_text($description); $country = process_user_text($country); if (!is_valid_country($country)) { $country = 'None'; } $country = boinc_real_escape_string($country); // for Cote d'Ivoire $query = sprintf( "insert into team (userid, create_time, name, name_lc, url, type, name_html, description, country, nusers, expavg_time) values(%d, %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', %d, unix_timestamp())", $userid, time(), $name, $name_lc, $url, $type, $name_html, $description, $country, 0 ); $result = mysql_query($query); if ($result) { $teamid = mysql_insert_id(); return lookup_team($teamid); } else { return null; } } ?>