use https for gravatar
[e-DoKo.git] / include / functions.php
index cb784575d783fc344077c3db9d8d78cbe1964433..888be82d5e2c531a6c91c300a9c21e9827fcbf0c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/* Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 Arun Persaud <arun@nubati.net>
+/* Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Arun Persaud <arun@nubati.net>
  *
  *   This file is part of e-DoKo.
  *
@@ -106,101 +106,106 @@ define("CARDS_GAMEOVER",    5); /* show all cards from everyone (looking at some
 
 function mymail($uid,$gameid=0,$type,$message)
 {
-  global $EmailName,$WIKI;
+  global $EmailName,$WIKI,$PREF;
 
-  /* do we send the email right away or save it in the database? */
-  $send_now = 1;
-
-  /* add standard header and footer */
-  $subject = "$EmailName ";
-  if($gameid)
-    $game = DB_format_gameid($gameid);
-  else
-    $game = '';
-
-  switch($type)
+  /* uid can be either a single uid or an array, convert everything to
+   *  an array, so that we can loop over it */
+  if(!is_array($uid))
     {
-    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);
+      $to_uid=$uid;
+      $uid = array();
+      $uid[]=$to_uid;
     }
 
-  /* 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, bugs, etc.: $WIKI";
-
-  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
+  foreach($uid as $user)
     {
-      /* standard greeting */
-      $name    = DB_get_name('userid',$uid);
-      $header  = "Hello $name\n\n";
+      /* do we send the email right away or save it in the database? */
+      $send_now = 1;
 
-      $To = DB_get_email('userid',$uid);
+      $name = DB_get_name('userid',$user);
+      $To   = DB_get_email('userid',$user);
 
       /* 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;
-    }
+      $uidPREF = DB_get_PREF($user);
+      if( $uidPREF['digest'] != 'digest-off' )
+        $send_now = 0;
+      /* use local language */
+      set_language($uidPREF['language']);
 
-  if($send_now)
-    sendmail($To,$subject,$header.$message.$footer);
-  else
-    {
-      /* store email in database */
-      DB_digest_insert_email($To,$message,$type,$gameid);
+      $header  = sprintf(_('Hello %s'),$name);
+      $header .= "\n\n";
+
+      /* add standard header and footer */
+      $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  = "\n"._('Have 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, bugs, etc.').": $WIKI";
+
+      if($send_now)
+        sendmail($To,$subject,$header.$message.$footer);
+      else
+        {
+          /* store email in database */
+          DB_digest_insert_email($To,$message,$type,$gameid);
+        }
     }
+
+  /* reset language to original user*/
+  set_language($PREF['language']);
+
+  return;
 }
 
 function sendmail($To,$Subject,$message)
@@ -213,6 +218,10 @@ function sendmail($To,$Subject,$message)
   if(isset($EMAIL_REPLY))
     $header .= "From: e-DoKo daemon <$EMAIL_REPLY>\r\n";
 
+  $header .= "Content-Type: text/plain; charset = \"UTF-8\";\r\n";
+  $header .= "Content-Transfer-Encoding: 8bit\r\n";
+  $header .= "\r\n";
+
   if($debug)
     {
       /* display email on screen,
@@ -223,15 +232,12 @@ function sendmail($To,$Subject,$message)
                              "<a href=\"$1\">$1</a>", $message);
 
       echo "<br />To: $To<br />";
-      if($header != "")
-       echo $header."<br />";
+      echo $header."<br />";
       echo "Subject: $Subject <br />$message<br />\n";
     }
   else
-    if($header != "")
-      mail($To,$Subject,$message,$header);
-    else
-      mail($To,$Subject,$message);
+    mail($To,$Subject,$message,$header);
+
   return;
 }
 
@@ -323,6 +329,7 @@ function compare_cards($a,$b,$game)
     case "normal":
     case "silent":
     case "trump":
+    case "wedding":
       if($RULES['schweinchen']=='both' && $GAME['schweinchen-who'])
        {
          if($a == 19 || $a == 20 )
@@ -350,6 +357,8 @@ function compare_cards($a,$b,$game)
          /* if not, do nothing and the foxes are just handeled as normal trump */
        }
        ;
+    case "poverty":
+    case "dpoverty":
     case "heart":
     case "spade":
     case "club":
@@ -979,23 +988,22 @@ function can_call($what,$hash)
 
 function display_table_begin ()
 {
-  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");
+  global $gameid;
+
+  $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='.DB_quote_smart($gameid).
+                    ' ORDER BY position ASC');
 
   $row0 = DB_fetch_array($result);
   $row1 = DB_fetch_array($result);
@@ -1011,25 +1019,26 @@ function display_table_begin ()
 
   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");
+  global $gameid;
+
+  $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='.DB_quote_smart($gameid).
+                    ' ORDER BY position ASC');
 
   $row0 = DB_fetch_array($result);
   $row1 = DB_fetch_array($result);
@@ -1047,8 +1056,8 @@ function display_single_user($r,$start=0)
 {
   /* start=1, mark starting player, default=0, so the player on the left is not marked */
 
-  global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session;
-  global $RULES,$GAME,$gametype;
+  global $gameid, $debug,$INDEX,$defaulttimezone;
+  global $RULES,$GAME, $gametype_raw;
 
       $name  = $r[0];
       $pos   = $r[1];
@@ -1064,7 +1073,7 @@ function display_single_user($r,$start=0)
       $lastlogin = strtotime($r[6]);
       date_default_timezone_set($timezone);
       $timenow   = strtotime(date("Y-m-d H:i:s"));
-      $gravatar = "$name<br />\n       <img class=\"gravatar\" title=\"$name\" src=\"http://www.gravatar.com/avatar/".
+      $gravatar = "$name<br />\n       <img class=\"gravatar\" title=\"$name\" src=\"https://www.gravatar.com/avatar/".
        md5(strtolower(trim($email)))."?d=identicon\" alt=\"$name's gravatar\" />";
 
       echo "  <div class=\"table".($pos-1)."\">\n";
@@ -1081,8 +1090,8 @@ function display_single_user($r,$start=0)
          $stop    = substr($vacation[1],0,10);
          $comment = $vacation[2];
 
-             $title = "begin: $start  end: $stop $comment";
-             echo "   <span class=\"vacation\" title=\"$title\">$gravatar (on vacation until $stop)</span> \n";
+         $title = _("begin:")." $start  "._("end:")." $stop $comment";
+             echo "   <span class=\"vacation\" title=\"$title\">$gravatar "._("(on vacation until $stop)")."</span> \n";
        }
       else
        echo "   $gravatar \n";
@@ -1090,11 +1099,11 @@ function display_single_user($r,$start=0)
        echo"   </a>\n";
 
       /* add hints for poverty, wedding, solo, etc */
-      if( $gametype != "solo")
+      if( $gametype_raw != "solo")
        if( $RULES["schweinchen"]=="both" && $GAME["schweinchen-who"]==$hash )
          echo " Schweinchen. <br />";
 
-      if($GT=="poverty" && $party=="re")
+      if($gametype_raw=="poverty" && $party=="re")
        if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump'))
          {
            $userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
@@ -1111,7 +1120,7 @@ function display_single_user($r,$start=0)
          echo "   <img src=\"pics/button/poverty_partner_button.png\" class=\"button\" ".
            "alt=\"poverty partner\" title=\"poverty partner\" />\n";
 
-      if($GT=="dpoverty")
+      if($gametype_raw=="dpoverty")
        if($party=="re")
          if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump'))
            {
@@ -1145,28 +1154,31 @@ function display_single_user($r,$start=0)
            echo "   <img src=\"pics/button/poverty2_partner_button.png\" class=\"button\" ".
              "alt=\"poverty2 >\" title=\"poverty2 partner\" />\n";
 
-      if($GT=="wedding" && $party=="re")
+      if($gametype_raw=="wedding" && $party=="re")
        if($sickness=="wedding")
          echo "   <img src=\"pics/button/wedding_button.png\" class=\"button\" alt=\"wedding\" title=\"wedding\" />\n";
        else
          echo "   <img src=\"pics/button/wedding_partner_button.png\" class=\"button\" ".
            "alt=\"wedding partner\" title=\"wedding partner\" />\n";
 
-      if( (strpos($GT,"solo")!==false) && $party=="re")
+      if( $gametype_raw=='solo' && $party=="re")
        {
-         if(strpos($GT,"queen")!==false)
+         $solotype = DB_get_solo_by_gameid($gameid);
+         $GT = get_display_gametype($gameid);
+
+         if($solotype=='queen')
            echo "   <img src=\"pics/button/queensolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Queen solo\" />\n";
-         else if(strpos($GT,"jack")!==false)
+         else if($solotype=='jack')
            echo "   <img src=\"pics/button/jacksolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Jack solo\" />\n";
-         else if(strpos($GT,"club")!==false)
+         else if($solotype=='club')
            echo "   <img src=\"pics/button/clubsolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Club solo\" />\n";
-         else if(strpos($GT,"spade")!==false)
+         else if($solotype=='spade')
            echo "   <img src=\"pics/button/spadesolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Spade solo\" />\n";
-         else if(strpos($GT,"heart")!==false)
+         else if($solotype=='heart')
            echo "   <img src=\"pics/button/heartsolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Heart solo\" />\n";
-         else if(strpos($GT,"trumpless")!==false)
+         else if($solotype=='trumpless')
            echo "   <img src=\"pics/button/notrumpsolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Trumpless solo\" />\n";
-         else if(strpos($GT,"trump")!==false)
+         else if($solotype=='trump')
            echo "   <img src=\"pics/button/trumpsolo_button.png\" class=\"button\" alt=\"$GT\" title=\"Trump solo\" />\n";
        }
 
@@ -1203,15 +1215,15 @@ function display_single_user($r,$start=0)
       switch($wins)
        {
        case 0:
-         echo "#tricks 0"; break;
+         echo _('#tricks 0'); break;
        case 1:
-         echo "#tricks 1"; break;
+         echo _('#tricks 1'); break;
        case 2:
        case 3:
        case 4:
-         echo "#tricks few"; break;
+         echo _('#tricks few'); break;
        default:
-         echo "#tricks many"; break;
+         echo _('#tricks many'); break;
        }
       echo "</span>\n";
       echo "  </div>\n";
@@ -1225,18 +1237,18 @@ function display_user_menu($id, $skiphash=NULL)
   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'".
+                      " WHERE Hand.user_id=".DB_quote_smart($id).
+                      " AND Hand.hash!=".DB_quote_smart($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) )".
+    $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='.DB_quote_smart($id).
+                      ' AND ( Game.player='.DB_quote_smart($id).' OR ISNULL(Game.player) )'.
                       " AND ( Game.status='pre' OR Game.status='play' )".
-                      " ORDER BY Game.session" );
+                      ' ORDER BY Game.session' );
 
   $i=0;
   while( $r = DB_fetch_array($result))
@@ -1287,8 +1299,8 @@ function generate_score_table($session)
   $player_party = array();
 
   /* get player id from the first game */
-  $result = DB_query("SELECT user_id from Hand".
-                    " WHERE Hand.game_id=".$gameids[0][0]);
+  $result = DB_query('SELECT user_id from Hand'.
+                    ' WHERE Hand.game_id='.DB_quote_smart($gameids[0][0]));
   while( $r = DB_fetch_array($result))
     $player[$r[0]] = 0;
 
@@ -1304,18 +1316,18 @@ function generate_score_table($session)
       foreach($player as $id=>$points)
        {
          $party = $player_party[$id][$i][0];
-         if($party == "re")
-           if($gametype=="solo")
+         if($party == 're')
+           if($gametype=='solo')
              $player[$id] += 3*$re_score;
            else
              $player[$id] += $re_score;
-         else if ($party == "contra")
+         else if ($party == 'contra')
            $player[$id] -= $re_score;
        }
       $score[$i]['gameid']  = $gameid[0] ;
       $score[$i]['players'] = $player;
       $score[$i]['points']  = abs($re_score);
-      $score[$i]['solo']    = ($gametype=="solo");
+      $score[$i]['solo']    = ($gametype=='solo');
 
       $i++;
     }
@@ -1444,7 +1456,7 @@ function format_score_table_ascii($score)
 
   /* truncate table if we have too many games */
   $max = sizeof($score);
-  if($max>6) $output.=" (table truncated to last 6 games)\n";
+  if($max>6) $output.=" "._("(table truncated to last 6 games)")."\n";
 
   /* output header */
   foreach($score[0]['players'] as $id=>$points)
@@ -1572,7 +1584,7 @@ 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'" );
+                          " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation start'" );
   if($result)
     $start = $result[0];
   else
@@ -1580,7 +1592,7 @@ function check_vacation($userid)
 
   /* get end date */
   $result = DB_query_array("SELECT value FROM User_Prefs".
-                    " WHERE user_id='$userid' AND pref_key='vacation stop'" );
+                          " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation stop'" );
   if($result)
     $stop = $result[0];
   else
@@ -1588,7 +1600,7 @@ function check_vacation($userid)
 
   /* get comment */
   $result = DB_query_array("SELECT value FROM User_Prefs".
-                    " WHERE user_id='$userid' AND pref_key='vacation comment'" );
+                          " WHERE user_id=".DB_quote_smart($userid)." AND pref_key='vacation comment'" );
   if($result)
     $comment = $result[0];
   else
@@ -1699,4 +1711,94 @@ function verify_password($email, $password)
   return 3;
 }
 
+/* language functions */
+function detectlanguage()
+{
+       /* read out browser's prefered language, taken from php-manual*/
+       $langcode = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+       $langcode = explode(",", $langcode['0']);
+       return $langcode['0'];
+}
+
+function set_language($l,$type='lang')
+{
+   if($type=='uid')
+     {
+       $userPREF = DB_get_PREF($l);
+       $l = $userPREF['language'];
+     };
+
+    switch($l)
+      {
+      case 'de':
+       putenv("LC_ALL=de_DE");
+       setlocale(LC_ALL, "de_DE");
+       break;
+      default:
+       putenv("LC_ALL=en_US");
+       setlocale(LC_ALL, "en_US");
+       break;
+      }
+
+    // Specify location of translation tables
+    bindtextdomain("edoko", "./locale");
+    bind_textdomain_codeset("edoko", 'UTF-8');
+    // Choose domain
+    textdomain("edoko");
+
+    return;
+}
+
+function get_display_gametype($gameid)
+{
+  /* return a readable string that can be displayed to show the game type
+   * this means hiding silent solo from the user
+   */
+
+  $gametype = DB_get_gametype_by_gameid($gameid);
+
+  if ($gametype == 'normal')
+    $GT = _('normal');
+  else if($gametype=='solo')
+    {
+      $solotype = DB_get_solo_by_gameid($gameid);
+
+      switch($solotype)
+       {
+       case 'trumpless':
+         $GT = _('trumpless solo');
+         break;
+        case 'jack':
+         $GT = _('jack solo');
+         break;
+        case 'queen':
+         $GT = _('queen solo');
+         break;
+        case 'trump':
+         $GT = _('trump solo');
+         break;
+        case 'club':
+         $GT = _('club solo');
+         break;
+        case 'spade':
+         $GT = _('spade solo');
+         break;
+        case 'heart':
+         $GT = _('heart solo');
+         break;
+        case 'silent':
+         $GT = _('normal');   /* this is change compared to $gametype */
+         break;
+        }
+    }
+  else if ($gametype == 'wedding')
+    $GT = _('wedding');
+  else if ($gametype == 'poverty')
+    $GT = _('poverty');
+  else if ($gametype == 'dpoverty')
+    $GT = _('double poverty');
+
+  return $GT;
+}
+
 ?>