X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=e-DoKo.git;a=blobdiff_plain;f=include%2Ffunctions.php;h=43fbb24deeeb726e6154b5f0bdad84e8e1d75811;hp=8307648975873ed49ddfb4bf66e0ec7fb0e193e7;hb=8413d51c55c34d83798127c9ba39358d86902c51;hpb=02b7328ec7f2c4d9eb7862553da000f386830017 diff --git a/include/functions.php b/include/functions.php index 8307648..43fbb24 100644 --- a/include/functions.php +++ b/include/functions.php @@ -54,10 +54,70 @@ function config_check() return; } -function mymail($To,$Subject,$message,$header="") +function mymail($uid,$subject,$message) { + global $EmailName; + + /* do we send the email right away or save it in the database? */ + $send_now = 1; + + /* add standard header and footer */ + $subject = "$EmailName".$subject; + + /* standard goodbye */ + $footer = "\nHave a nice day\n". + " your E-Doko service department\n\n". + "-- \n". + "You can change your mail delivery mode in the preference menu.\n". + 'web: http://doko.nubati.net '. + 'help: http://wiki.nubati.net/EmailDoko '. + 'bugs: http://wiki.nubati.net/EmailDokoIssues'; + + if(is_array($uid)) + { + /* send email to more than one person */ + + $header = "Hello all\n\n"; + + foreach($uid as $user) + { + $all[] = DB_get_email('userid',$user); + } + $To = implode(",",$all); + } + else + { + /* standard greeting */ + $name = DB_get_name('userid',$uid); + $header = "Hello $name\n\n"; + + $To = DB_get_email('userid',$uid); + + /* check if user wants email right away or if we should save it in + * the database for later delivery + */ + + $PREF = DB_get_PREF($uid); + if( $PREF['digest'] != 'digest-off' ) + $send_now = 0; + } + + if($send_now) + sendmail($To,$subject,$header.$message.$footer); + else + { + /* store email in database */ + DB_digest_insert_email($To,$message); + } +} + +function sendmail($To,$Subject,$message) +{ + /* this function sends the mail or outputs to the screen in case of debugging */ global $debug,$EMAIL_REPLY; + $header = ""; + if(isset($EMAIL_REPLY)) $header .= "From: e-DoKo daemon <$EMAIL_REPLY>\r\n"; @@ -104,7 +164,7 @@ function myisset() function myerror($message) { echo "".htmlspecialchars($message)."\n"; - mymail($ADMIN_EMAIL,$EmailName." Error in Code",$message); + sendmail($ADMIN_EMAIL,$EmailName." Error in Code",$message); return; } @@ -177,14 +237,27 @@ function compare_cards($a,$b,$game) return 1; if($b == 19 || $b == 20 ) return 0; - }; - if($RULES['schweinchen']=='second' && $GAME['schweinchen-second']) + } + else if($RULES['schweinchen']=='second' && $GAME['schweinchen-second']) { if($a == 19 || $a == 20 ) return 1; if($b == 19 || $b == 20 ) return 0; - }; + } + else if($RULES['schweinchen']=='secondaftercall' && $GAME['schweinchen-who'] && $GAME['schweinchen-second'] ) + { + /* check if a call was made either by the player or his partner. If so activate Schweinchen rule. */ + if(DB_get_call_by_hash($GAME['schweinchen-who']) || DB_get_partner_call_by_hash($GAME['schweinchen-who']) ) + { + if($a == 19 || $a == 20 ) + return 1; + if($b == 19 || $b == 20 ) + return 0; + } + /* if not, do nothing and the foxes are just handeled as normal trump */ + } + ; case "heart": case "spade": case "club": @@ -316,17 +389,22 @@ function check_wedding($cards) return 0; } -function count_trump($cards) +function count_trump($cards,$status='pregame') { global $RULES; $trump = 0; - /* count each trump, including the foxes */ + /* count each trump, including the foxes, since this is used to determine poverty status */ foreach($cards as $c) if( (int)($c) <27) $trump++; + /* In case we really want to know the amount of trump, we can use the status variable. + * This is needed for example to figure out what icon to display on the table in case of + * trump given back in poverty */ + if($status=='all') return $trump; + /* normally foxes don't count as trump, so we substract them here * in case someone has schweinchen, one or two of them should count as trump * though, so we need to add one trump for those cases */ @@ -595,21 +673,39 @@ function set_gametype($gametype) function mysort($cards,$gametype) { - usort ( $cards, "sort_comp" ); + global $PREF; + if(isset($PREF['sorting'])) + if($PREF['sorting']=='high-low') + usort ( $cards, 'sort_comp_high_low' ); + else + usort ( $cards, 'sort_comp_low_high' ); + else + usort ( $cards, 'sort_comp_high_low' ); return $cards; } -function sort_comp($a,$b) +function sort_comp_high_low($a,$b) { global $CARDS; $ALL = array(); - $ALL = array_merge($CARDS["trump"],$CARDS["diamonds"],$CARDS["clubs"], - $CARDS["hearts"],$CARDS["spades"]); + $ALL = array_merge($CARDS['trump'],$CARDS['diamonds'],$CARDS['clubs'], + $CARDS['hearts'],$CARDS['spades']); return pos_array($a,$ALL)-pos_array($b,$ALL); } +function sort_comp_low_high($a,$b) +{ + global $CARDS; + + $ALL = array(); + $ALL = array_merge($CARDS['trump'],$CARDS['diamonds'],$CARDS['clubs'], + $CARDS['hearts'],$CARDS['spades']); + + return -pos_array($a,$ALL)+pos_array($b,$ALL); +} + function can_call($what,$hash) { global $RULES; @@ -696,7 +792,7 @@ function can_call($what,$hash) function display_table () { - global $gameid, $GT, $debug,$INDEX,$defaulttimezone; + global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session; global $RULES,$GAME,$gametype; $result = DB_query("SELECT User.fullname as name,". @@ -725,16 +821,29 @@ function display_table () $call = $r[5]; $hash = $r[7]; $timezone = $r[8]; + $wins = DB_get_number_of_tricks($gameid,$pos); date_default_timezone_set($defaulttimezone); $lastlogin = strtotime($r[6]); date_default_timezone_set($timezone); $timenow = strtotime(date("Y-m-d H:i:s")); echo "
\n"; - if(!$debug) - echo " $name \n"; + + if($debug) + echo " "; + if($vacation = check_vacation($user)) + { + $start = $vacation[0]; + $stop = substr($vacation[1],0,10); + $comment = $vacation[2]; + + $title = "begin: $start end: $stop $comment"; + echo " $name (on vacation until $stop) \n"; + } else - echo " $name\n"; + echo " $name \n"; + if($debug) + echo"\n"; /* add hints for poverty, wedding, solo, etc */ if( $gametype != "solo") @@ -746,14 +855,14 @@ function display_table () { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); - $trumpNR = count_trump($cards); + $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty"; + echo " \"poverty"; else - echo " \"poverty"; + echo " \"poverty"; } else - echo " \"poverty\" />"; + echo " \"poverty\" title=\"poverty partner\" />"; if($GT=="dpoverty") if($party=="re") @@ -761,79 +870,97 @@ function display_table () { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); - $trumpNR = count_trump($cards); + $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty"; + echo " \"poverty"; else - echo " \"poverty"; + echo " \"poverty"; } else - echo " \"poverty\" />"; + echo " \"poverty\" title=\"poverty partner\" />"; else if($sickness=="poverty") { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); - $trumpNR = count_trump($cards); + $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty2"; + echo " \"poverty2"; else - echo " \"poverty2"; + echo " \"poverty2"; } else - echo " \"poverty2\" />"; + echo " \"poverty2\" title=\"poverty2 partner\" />"; if($GT=="wedding" && $party=="re") if($sickness=="wedding") - echo " \"wedding\""; + echo " \"wedding\""; else - echo " \"wedding"; + echo " \"wedding"; if(ereg("solo",$GT) && $party=="re") { if(ereg("queen",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("jack",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("club",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("spade",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("heart",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("trumpless",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; else if(ereg("trump",$GT)) - echo " \"$GT\""; + echo " \"$GT\""; } /* add point calls */ if($call!=NULL) { if($party=="re") - echo " \"re\""; + echo " \"re\""; else - echo " \"contra\""; + echo " \"contra\""; switch($call) { case "0": - echo " \"0\""; + echo " \"0\""; break; case "30": - echo " \"30\""; + echo " \"30\""; break; case "60": - echo " \"60\""; + echo " \"60\""; break; case "90": - echo " \"90\""; + echo " \"90\""; break; } } echo "
\n"; - echo " local time\n"; - echo " last login\n"; + echo " ". + "\"time". + "\n"; + + /* show how many tricks the person made */ + switch($wins) + { + case 0: + echo "#tricks 0"; break; + case 1: + echo "#tricks 1"; break; + case 2: + case 3: + case 4: + echo "#tricks few"; break; + default: + echo "#tricks many"; break; + } + echo "
\n"; } @@ -844,15 +971,15 @@ function display_table () } -function display_user_menu() +function display_user_menu($id) { - global $WIKI,$myid,$INDEX; + global $WIKI,$INDEX; $result = DB_query("SELECT Hand.hash,Hand.game_id,Game.player from Hand". " LEFT JOIN Game On Hand.game_id=Game.id". - " WHERE Hand.user_id='$myid'". - " AND Game.player='$myid'". - " AND Game.status<>'gameover'". + " WHERE Hand.user_id='$id'". + " AND ( Game.player='$id' OR ISNULL(Game.player) )". + " AND ( Game.status='pre' OR Game.status='play' )". " ORDER BY Game.session" ); $i=0; @@ -865,7 +992,8 @@ function display_user_menu() } $i++; - echo "game ".DB_format_gameid($r[1])."
\n"; + echo "game ".DB_format_gameid($r[1])."
\n"; if($i>4) { echo "...
\n"; @@ -907,11 +1035,12 @@ function generate_score_table($session) foreach($gameids as $gameid) { $re_score = DB_get_score_by_gameid($gameid); + $gametype = DB_get_gametype_by_gameid($gameid); foreach($player as $id=>$points) { $party = DB_get_party_by_gameid_and_userid($gameid,$id); if($party == "re") - if(DB_get_gametype_by_gameid($gameid)=="solo") + if($gametype=="solo") $player[$id] += 3*$re_score; else $player[$id] += $re_score; @@ -921,7 +1050,7 @@ function generate_score_table($session) $score[$i]['gameid'] = $gameid ; $score[$i]['players'] = $player; $score[$i]['points'] = abs($re_score); - $score[$i]['solo'] = (DB_get_gametype_by_gameid($gameid)=="solo"); + $score[$i]['solo'] = ($gametype=="solo"); $i++; } @@ -937,32 +1066,37 @@ function generate_global_score_table() $gameids = DB_get_gameids_of_finished_games_by_session(0); if($gameids == NULL) - return ""; + return ''; /* get player id, names... from the User table */ $player = array(); - $result = DB_query("SELECT User.id, User.fullname FROM User"); + $result = DB_query('SELECT User.id, User.fullname FROM User'); + /* save information in an array */ while( $r = DB_fetch_array($result)) - $player[] = array( 'id' => $r[0], 'name'=> $r[1], 'points' => 0 ,'nr' => 0); + $player[$r[0]] = array('name'=> $r[1], 'points' => 0 ,'nr' => 0); /* get points and generate table */ foreach($gameids as $gameid) { $re_score = DB_get_score_by_gameid($gameid); - /* TODO: this shouldn't loop over all players, just the 4 players that are in the game */ - foreach($player as $key=>$pl) + $gametype = DB_get_gametype_by_gameid($gameid); + + /* get players involved in this game */ + $result = DB_query('SELECT user_id FROM Hand WHERE game_id='.DB_quote_smart($gameid)); + while($r = DB_fetch_array($result)) { - $party = DB_get_party_by_gameid_and_userid($gameid,$pl['id']); - if($party == "re") - if(DB_get_gametype_by_gameid($gameid)=="solo") - $player[$key]['points'] += 3*$re_score; + $id = $r[0]; + $party = DB_get_party_by_gameid_and_userid($gameid,$id); + if($party == 're') + if($gametype=='solo') + $player[$id]['points'] += 3*$re_score; else - $player[$key]['points'] += $re_score; - else if ($party == "contra") - $player[$key]['points'] -= $re_score; + $player[$id]['points'] += $re_score; + else if ($party == 'contra') + $player[$id]['points'] -= $re_score; if($party) - $player[$key]['nr']+=1; + $player[$id]['nr']+=1; } } @@ -978,13 +1112,13 @@ function generate_global_score_table() return 0; return ($a > $b) ? -1 : 1; } - usort($player,"cmp"); + usort($player,'cmp'); foreach($player as $pl) { /* limit to players with at least 10 games */ if($pl['nr']>10) - $return[] = array( $pl['name'], round($pl['points']/$pl['nr'],3) ); + $return[] = array( $pl['name'], round($pl['points']/$pl['nr'],3), $pl['points'],$pl['nr']); } return $return; @@ -996,7 +1130,9 @@ function format_score_table_ascii($score) if(sizeof($score)==0) return ""; - // if(sizeof($score)>5) $header.= " ... \n"; + /* truncate table if we have too many games */ + $max = sizeof($score); + if($max>6) $output.=" (table truncated to last 6 games)\n"; /* output header */ foreach($score[0]['players'] as $id=>$points) @@ -1004,18 +1140,16 @@ function format_score_table_ascii($score) $name = DB_get_name('userid',$id); /*TODO*/ $output.= " ".substr($name,0,2)." |"; } - $output.=" P |\n "; + $output.=" P |\n"; $output.= "------+------+------+------+------+\n"; - $max = sizeof($score); + /* output score for each game */ $i=0; - - if($i<$max-6) $output.=" ...\n"; - foreach($score as $game) { $i++; if($i-1<$max-6) continue; + foreach($game['players'] as $id=>$points) $output.=str_pad($points,6," ",STR_PAD_LEFT)."|"; $output.=str_pad($game['points'],4," ",STR_PAD_LEFT); @@ -1038,40 +1172,66 @@ function format_score_table_html($score,$userid) if(sizeof($score)==0) return ""; - $output = "
\n\n \n"; + $output = "
\n
\n"; /* output header */ - $output.= " "; + $header = ""; + $header.= " \n \n"; + $header.= " "; + foreach($score[0]['players'] as $id=>$points) + { + $name = DB_get_name('userid',$id); /*TODO*/ + $header.= ""; + } + $header.="\n \n \n"; + + /* use the same as footer */ + $footer = ""; + $footer.= " \n \n"; + $footer.= " "; foreach($score[0]['players'] as $id=>$points) { $name = DB_get_name('userid',$id); /*TODO*/ - $output.= ""; + $footer.= ""; } - $output.="\n \n\n\n"; + $footer.="\n \n \n"; + /* body */ + $body = ""; + $body.= " \n"; $i=0; foreach($score as $game) { $i++; - $output.=" "; + $body.=" "; $userhash = DB_get_hash_from_gameid_and_userid($game['gameid'],$userid); - $output.=" "; + /* create link to old games only if you are logged in and its your game*/ + if(isset($_SESSION['id']) && $_SESSION['id']==$userid) + $body.=" "; + else + $body.=" "; + foreach($game['players'] as $id=>$points) - $output.=""; - $output.=""; + $body.="\n"; + $body.= " S"; + $body.="\n"; } - $output.="\n
No
No ".substr($name,0,2)." P
No ".substr($name,0,2)." ".substr($name,0,2)." P
P
$i $i$i".$points."".$game['points']; + $body.="".$points."".$game['points']; /* check for solo */ if($game['solo']) - $output.= " S"; - $output.="
\n"; + $output.=$header; + if($i>12) + $output.=$footer; + $output.=$body; + + $output.=" \n\n\n"; return $output; } -function createCache($content, $cacheFile) +function createCache($content, $cacheFile) { $fp = fopen($cacheFile,"w"); if($fp) @@ -1085,10 +1245,10 @@ function createCache($content, $cacheFile) return; } -function getCache($cacheFile, $expireTime) +function getCache($cacheFile, $expireTime) { - if( file_exists($cacheFile) && - filemtime($cacheFile )>( time() - $expireTime ) ) + if( file_exists($cacheFile) && + filemtime($cacheFile )>( time() - $expireTime ) ) { return file_get_contents($cacheFile); } @@ -1096,5 +1256,69 @@ function getCache($cacheFile, $expireTime) return false; } +function check_vacation($userid) +{ + /* get start date */ + $result = DB_query_array("SELECT value FROM User_Prefs". + " WHERE user_id='$userid' AND pref_key='vacation start'" ); + if($result) + $start = $result[0]; + else + return NULL; + + /* get end date */ + $result = DB_query_array("SELECT value FROM User_Prefs". + " WHERE user_id='$userid' AND pref_key='vacation stop'" ); + if($result) + $stop = $result[0]; + else + return NULL; + + /* get comment */ + $result = DB_query_array("SELECT value FROM User_Prefs". + " WHERE user_id='$userid' AND pref_key='vacation comment'" ); + if($result) + $comment = $result[0]; + else + $comment = ''; + + /* check if user is on vacation. TODO: use user's timezone */ + if( (time() - strtotime($start) >0) && + (strtotime($stop) - time() >0)) + return array ($start,$stop,$comment); + else + return NULL; +} + +function cancel_game($why,$gameid) +{ + $gameid = DB_quote_smart($gameid); + + /* update the game table */ + switch($why) + { + case 'timedout': + DB_query("UPDATE Game SET status='cancel-timedout' WHERE id=$gameid"); + break; + case 'nines': + DB_query("UPDATE Game SET status='cancel-nines' WHERE id=$gameid"); + break; + case 'trump': + DB_query("UPDATE Game SET status='cancel-trump' WHERE id=$gameid"); + break; + case 'noplay': + DB_query("UPDATE Game SET status='cancel-noplay' WHERE id=$gameid"); + break; + } + /* set each player to gameover */ + $result = DB_query("SELECT id FROM Hand WHERE game_id=".DB_quote_smart($gameid)); + while($r = DB_fetch_array($result)) + { + $id = $r[0]; + DB_query("UPDATE Hand SET status='gameover' WHERE id=".DB_quote_smart($id)); + } + + return; +} ?>