X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=e-DoKo.git;a=blobdiff_plain;f=include%2Ffunctions.php;h=c6544131045bde1fd6725c6cf099b5ac061d55b1;hp=eca0155f3e2de43cc22cdb11b91c9d8e4907dd02;hb=69b24a34b64f4eeb9279e0d66577f555c82b01eb;hpb=e2d7a3291f85403b4faf6f8be7e30caeefb0c1a3 diff --git a/include/functions.php b/include/functions.php index eca0155..c654413 100644 --- a/include/functions.php +++ b/include/functions.php @@ -1,4 +1,23 @@ + * + * This file is part of e-DoKo. + * + * e-DoKo is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * e-DoKo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with e-DoKo. If not, see . + * + */ + /* make sure that we are not called from outside the scripts, * use a variable defined in config.php to check this */ @@ -54,15 +73,86 @@ function config_check() return; } -function mymail($uid,$subject,$message) +/* define possible status for email subsjects */ +define("GAME_CANCELED", 0); +define("GAME_CANCELED_POVERTY", 1); +define("GAME_CANCELED_TIMEOUT", 2); +define("GAME_YOUR_TURN", 3); +define("GAME_READY", 4); +define("GAME_POVERTY", 5); +define("GAME_DPOVERTY", 6); +define("GAME_OVER", 7); +define("GAME_RECOVERY", 8); +define("GAME_REMINDER", 9); +define("GAME_NEW", 10); + +/* define possible status for showing cards */ + +define("CARDS_EMPTY", 0); /* show player's hand*/ +define("CARDS_SHOW", 1); /* show player's hand*/ +define("CARDS_MYTURN", 2); /* show radiobuttons for cards that can be played*/ +define("CARDS_EXCHANGE", 3); /* do we need to return cards to our partner in poverty?*/ +define("CARDS_GAMEOVER_ME", 4); /* show all cards from everyone*/ +define("CARDS_GAMEOVER", 5); /* show all cards from everyone (looking at someone else's game)*/ + + /* cards_status: SHOW show our hand + * MYTURN show radiobutton for cards that can be played + * EXCHANGE do we need to return cards to our partner in poverty? + * GAMEOVER show all cards from everyone + */ + +function mymail($uid,$gameid=0,$type,$message) { - global $EmailName; + global $EmailName,$WIKI; /* do we send the email right away or save it in the database? */ $send_now = 1; /* add standard header and footer */ - $subject = "$EmailName".$subject; + $subject = "$EmailName "; + if($gameid) + $game = DB_format_gameid($gameid); + else + $game = ''; + + switch($type) + { + case GAME_CANCELED: + $subject.=sprintf(_("Game %s canceled"),$game); + break; + case GAME_CANCELED_POVERTY: + $subject.=sprintf(_("Game %s canceled (poverty not resolved)"),$game); + break; + case GAME_CANCELED_TIMEOUT: + $subject.=sprintf(_("Game %s canceled (timed out)"),$game); + break; + case GAME_YOUR_TURN: + $subject.=sprintf(_("A card has been played in game %s"),$game); + break; + case GAME_READY: + $subject.=sprintf(_("Ready, set, go... (game %s)"),$game); + break; + case GAME_POVERTY: + $subject.=sprintf(_("Poverty (game %s)"),$game); + break; + case GAME_DPOVERTY: + $subject.=sprintf(_("Double poverty (game %s)"),$game); + break; + case GAME_OVER: + $subject.=sprintf(_("Game over (game %s)"),$game); + break; + case GAME_RECOVERY: + $subject.=_("Recovery"); + break; + case GAME_REMINDER: + $subject.=sprintf(_("Reminder: game %s it's your turn"),$game); + break; + case GAME_NEW: + $subject.=sprintf(_("You are invited to a game of DoKo (game %s)"),$game); + break; + default: + $subject.=sprintf(_("Problem with email, contact admin (errorcode %d)"),$gameid); + } /* standard goodbye */ $footer = "\nHave a nice day\n". @@ -70,8 +160,7 @@ function mymail($uid,$subject,$message) "-- \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'; + "help, bugs, etc.: $WIKI"; if(is_array($uid)) { @@ -127,8 +216,8 @@ function sendmail($To,$Subject,$message) * change txt -> html */ $message = str_replace("\n","
\n",$message); - $message = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", - "\\0", $message); + $message = preg_replace("#(\w+://[^<>\s]+[\w/]*)#", + "$1", $message); echo "
To: $To
"; if($header != "") @@ -436,6 +525,39 @@ function count_trump($cards,$status='pregame') return $trump; } +function check_low_trump($cards) +{ + global $RULES; + + if($RULES['lowtrump']=='none') + return 0; + + /* check if we have low trump */ + + $lowtrump=1; + foreach($cards as $card) + { + /* card a trump, but not a diamond? */ + if( $card<19 ) + $lowtrump=0; + } + + /* handle case where player has schweinchen */ + if( in_array("19",$cards) && in_array("20",$cards) ) + switch($RULES["schweinchen"]) + { + case "both": + case "second": + case "secondaftercall": + $lowtrump=0; + break; + case "none": + break; + } + + return $lowtrump; +} + function create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD) { global $debug; @@ -448,12 +570,12 @@ function create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD) $r[ 1]=2; $r[13]=23; $r[25]=14; $r[37]=38; $r[ 2]=3; $r[14]=27; $r[26]=15; $r[38]=39; $r[ 3]=4; $r[15]=16; $r[27]=28; $r[39]=40; - $r[ 4]=5; $r[16]=17; $r[28]=29; $r[40]=41; + $r[ 4]=5; $r[16]=17; $r[28]=29; $r[40]=21; $r[ 5]=18; $r[17]=6; $r[29]=30; $r[41]=42; - $r[ 6]=21; $r[18]=7; $r[30]=31; $r[42]=43; - $r[ 7]=22; $r[19]=8; $r[31]=32; $r[43]=44; - $r[ 8]=45; $r[20]=9; $r[32]=19; $r[44]=33; - $r[ 9]=46; $r[21]=10; $r[33]=20; $r[45]=24; + $r[ 6]=41; $r[18]=7; $r[30]=31; $r[42]=43; + $r[ 7]=22; $r[19]=8; $r[31]=32; $r[43]=20; + $r[ 8]=45; $r[20]=9; $r[32]=33; $r[44]=19; + $r[ 9]=46; $r[21]=10; $r[33]=44; $r[45]=24; $r[10]=35; $r[22]=11; $r[34]=48; $r[46]=25; $r[11]=36; $r[23]=12; $r[35]=34; $r[47]=26; } @@ -805,12 +927,12 @@ function can_call($what,$hash) } else if ( 9 == ($NRcards + $offset)) { - if( ($mincall>=0 && $mincall==120) ) + if( ($mincall>=0 && $mincall<=120 && $what<=90 ) ) return 2; } else if ( 9 < ($NRcards + $offset)) { - if( ($mincall>=0 && $mincall==120) ) + if( ($mincall>=0 && $mincall<=120 && $what<=90 ) ) return 1; } else if ( 6 == ($NRcards + $offset)) @@ -849,7 +971,7 @@ function can_call($what,$hash) return 0; } -function display_table () +function display_table_begin () { global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session; global $RULES,$GAME,$gametype; @@ -869,10 +991,57 @@ function display_table () "WHERE Hand.game_id='".$gameid."' ". "ORDER BY position ASC"); - echo "
\n". - " \"table\"\n"; - while($r = DB_fetch_array($result)) - { + $row0 = DB_fetch_array($result); + $row1 = DB_fetch_array($result); + $row2 = DB_fetch_array($result); + $row3 = DB_fetch_array($result); + + echo "
\n"; + display_single_user($row1); + echo "\n
\n"; + display_single_user($row0); + echo " \"table\"\n"; + display_single_user($row2); + + return; +} +function display_table_end () +{ + global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session; + global $RULES,$GAME,$gametype; + + $result = DB_query("SELECT User.fullname as name,". + " Hand.position as position, ". + " User.id, ". + " Hand.party as party, ". + " Hand.sickness as sickness, ". + " Hand.point_call, ". + " User.last_login, ". + " Hand.hash, ". + " User.timezone, ". + " User.email ". + "FROM Hand ". + "LEFT JOIN User ON User.id=Hand.user_id ". + "WHERE Hand.game_id='".$gameid."' ". + "ORDER BY position ASC"); + + $row0 = DB_fetch_array($result); + $row1 = DB_fetch_array($result); + $row2 = DB_fetch_array($result); + $row3 = DB_fetch_array($result); + + echo "
\n"; + display_single_user($row3); + echo "
\n"; + + return; +} + +function display_single_user($r) +{ + global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session; + global $RULES,$GAME,$gametype; + $name = $r[0]; $pos = $r[1]; $user = $r[2]; @@ -887,8 +1056,8 @@ function display_table () $lastlogin = strtotime($r[6]); date_default_timezone_set($timezone); $timenow = strtotime(date("Y-m-d H:i:s")); - $gravatar = "$name
"; - + $gravatar = "$name
\n \"$name's"; echo "
\n"; @@ -906,7 +1075,7 @@ function display_table () else echo " $gravatar \n"; if($debug) - echo"\n"; + echo" \n"; /* add hints for poverty, wedding, solo, etc */ if( $gametype != "solo") @@ -914,101 +1083,110 @@ function display_table () echo " Schweinchen.
"; if($GT=="poverty" && $party=="re") - if($sickness=="poverty") + if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump')) { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty"; + echo " \n"; else - echo " \"poverty"; + echo " \n"; } else - echo " \"poverty\" title=\"poverty partner\" />"; + echo " \n"; if($GT=="dpoverty") if($party=="re") - if($sickness=="poverty") + if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump')) { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty"; + echo " \n"; else - echo " \"poverty"; + echo " \n"; } else - echo " \"poverty\" title=\"poverty partner\" />"; + echo " \" title=\"poverty partner\" />\n"; else - if($sickness=="poverty") + if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump')) { $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user); $cards = DB_get_all_hand($userhash); $trumpNR = count_trump($cards,'all'); if($trumpNR) - echo " \"poverty2"; + echo " \n"; else - echo " \"poverty2"; + echo " \n"; } else - echo " \"poverty2\" title=\"poverty2 partner\" />"; + echo " \" title=\"poverty2 partner\" />\n"; if($GT=="wedding" && $party=="re") if($sickness=="wedding") - echo " \"wedding\""; + echo " \"wedding\"\n"; else - echo " \"wedding"; + echo " \n"; - if(ereg("solo",$GT) && $party=="re") + if( (strpos($GT,"solo")!==false) && $party=="re") { - if(ereg("queen",$GT)) - echo " \"$GT\""; - else if(ereg("jack",$GT)) - echo " \"$GT\""; - else if(ereg("club",$GT)) - echo " \"$GT\""; - else if(ereg("spade",$GT)) - echo " \"$GT\""; - else if(ereg("heart",$GT)) - echo " \"$GT\""; - else if(ereg("trumpless",$GT)) - echo " \"$GT\""; - else if(ereg("trump",$GT)) - echo " \"$GT\""; + if(strpos($GT,"queen")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"jack")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"club")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"spade")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"heart")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"trumpless")!==false) + echo " \"$GT\"\n"; + else if(strpos($GT,"trump")!==false) + echo " \"$GT\"\n"; } /* add point calls */ if($call!=NULL) { if($party=="re") - echo " \"re\""; + echo " \"re\"\n"; else - echo " \"contra\""; + echo " \"contra\"\n"; switch($call) { case "0": - echo " \"0\""; + echo " \"0\"\n"; break; case "30": - echo " \"30\""; + echo " \"30\"\n"; break; case "60": - echo " \"60\""; + echo " \"60\"\n"; break; case "90": - echo " \"90\""; + echo " \"90\"\n"; break; } } - echo "
\n"; - echo " ". - "\"time". - "\n"; + echo " \"time"; + echo "
"; /* show how many tricks the person made */ switch($wins) { @@ -1023,49 +1201,56 @@ function display_table () default: echo "#tricks many"; break; } - - echo "
\n"; - - } - echo "
\n"; /* end output table */ - - - return; + echo "\n"; + echo " \n"; } -function display_user_menu($id) +function display_user_menu($id, $skiphash=NULL) { 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='$id'". - " AND ( Game.player='$id' OR ISNULL(Game.player) )". - " AND ( Game.status='pre' OR Game.status='play' )". - " ORDER BY Game.session" ); + if($skiphash) + $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='$id'". + " AND Hand.hash!='$skiphash'". + " AND ( Game.player='$id' OR ISNULL(Game.player) )". + " AND ( Game.status='pre' OR Game.status='play' )". + " ORDER BY Game.session" ); + else + $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='$id'". + " AND ( Game.player='$id' OR ISNULL(Game.player) )". + " AND ( Game.status='pre' OR Game.status='play' )". + " ORDER BY Game.session" ); $i=0; while( $r = DB_fetch_array($result)) { if($i==0) { - echo "
\n"; - echo "It's your turn in these games:
\n"; + echo "\n
\n "; + echo _('It\'s your turn in these games').":\n"; + } + else + { + echo ", "; } $i++; - echo "game ".DB_format_gameid($r[1])."
\n"; + echo " ".DB_format_gameid($r[1])." \n"; if($i>4) { - echo "...
\n"; + echo ", ...\n"; break; } } if($i) - echo "
\n"; + echo "
\n\n"; return; } @@ -1137,7 +1322,8 @@ function generate_global_score_table() /* save information in an array */ while( $r = DB_fetch_array($result)) - $player[$r[0]] = array('name'=> $r[1], 'points' => 0 ,'nr' => 0); + $player[$r[0]] = array('name'=> $r[1], 'points' => 0 , 'nr' => 0, 'active' => 0, + 'response' => 0 , 'solo' => 0, 'soloavg' => 0); /* get points and generate table */ foreach($gameids as $gameid) @@ -1163,9 +1349,53 @@ function generate_global_score_table() } } + /* add number of active games */ + $result = DB_query_array_all("SELECT user_id, COUNT(*) as c " . + " FROM Hand". + " LEFT JOIN Game ON Game.id=game_id". + " WHERE Game.status IN ('pre','play')". + " GROUP BY user_id"); + + foreach($result as $res) + { + $player[$res[0]]['active'] = $res[1]; + } + + /* response time of users*/ + $result = DB_query_array_all("SELECT user_id,". + "IFNULL(AVG(if(P1.sequence in (2,3,4),". + "-timestampdiff(MINUTE,mod_date,(select mod_date from Play P2 where P1.trick_id=P2.trick_id and P2.sequence=P1.sequence-1)),NULL )),1e9) as a ". + "FROM Play P1 ". + "LEFT JOIN Hand_Card ON P1.hand_card_id=Hand_Card.id ". + "LEFT JOIN Hand ON Hand.id=Hand_Card.hand_id ". + "GROUP BY user_id "); + + foreach($result as $res) + { + $player[$res[0]]['response'] = $res[1]; + } + + /* most solos */ + $result = DB_query_array_all("SELECT user_id as uid,". + " COUNT(*), ". + " COUNT(*)/(SELECT COUNT(*) FROM Hand LEFT JOIN User ON User.id=Hand.user_id WHERE User.id=uid) as c ". + " FROM Game ". + " LEFT JOIN Hand ON Hand.position=startplayer AND Game.id=Hand.game_id ". + " WHERE type='solo' AND Game.status='gameover' ". + " GROUP BY user_id "); + + foreach($result as $res) + { + $player[$res[0]]['solo'] = $res[1]; + $player[$res[0]]['soloavg'] = $res[2]; + } + + + /* sort everything nicely */ + function cmp($a,$b) { - if($a['nr']==0 ) return 1; + if($a['nr']==0) return 1; if($b['nr']==0) return 1; $a=$a['points']/$a['nr']; @@ -1177,11 +1407,13 @@ function generate_global_score_table() } 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), $pl['points'],$pl['nr']); + $return[] = array( $pl['name'], round($pl['points']/$pl['nr'],3), $pl['points'],$pl['nr'],$pl['active'], + $pl['response'],$pl['solo'],$pl['soloavg']); } return $return; @@ -1372,6 +1604,9 @@ function cancel_game($why,$gameid) case 'noplay': DB_query("UPDATE Game SET status='cancel-noplay' WHERE id=$gameid"); break; + case 'lowtrump': + DB_query("UPDATE Game SET status='cancel-lowtrump' WHERE id=$gameid"); + break; } /* set each player to gameover */ $result = DB_query("SELECT id FROM Hand WHERE game_id=".DB_quote_smart($gameid)); @@ -1384,4 +1619,18 @@ function cancel_game($why,$gameid) return; } +function get_user_token($userid) +{ + + $token = NULL; + + $date = DB_get_user_creation_date($userid); + $name = DB_get_name('userid',$userid); + + if($date && $name) + $token = md5("token".$name.$date); + + return $token; +} + ?>