respondinvitation.php

<?php include("getuserinc.php"); ?>
<root>
<?php
    openDatabase
();
    
    
//This file allows one user to invite another to play or to 
    //respond to another's invitation. This is complex and involves the
    //gameusermap and game tables.

    //When one user invites another to play, we create a new entry in the game
    //table: a prospective game. We also create two gameusermap entries: one
    //linking our userid to that game; the other linking the id of the user we're
    //inviting to that game. 

    //Each of those gameusermap entries has
    //an invitationstatus field, which indicates whether the user
    //is willing to play with the other user. When we
    //invite someone else to play, we set our invitationstatus to 'willing'
    //(on the gameusermap entry with our userid and the appropriate gameid)
    //and we set their invitationstatus to 'unconfirmed'.

    //To accept an invitation, the other user changes that 'unconfirmed'
    //status to 'willing'. When both partners are 'willing', the
    //game starts.

    //This file firstly checks whether two gameusermap entries are
    //present which link the two users to a game. If they're not,
    //we create those two entries and a new game. If they are,
    //we simply set the invitationstatus on our gameusermap entry.

    //Once all that's done, we return an XML tree showing
    //the new state of the invitations.

    //Get our inputs
    
$sOtherUserId getAndCheckParameter("userid"PATTERN_STANDARD_TEXT"There's been a database error (userid is zero)");
    
$sNewStatus getAndCheckParameter("newstatus"PATTERN_ALPHANUMERIC"There's been a database error (userid is zero)");

    if (
$sNewStatus <> 'unconfirmed'
          
&& $sNewStatus <> 'willing'
          
&& $sNewStatus <> 'refused')
    {
        
exitWithError("ERROR: There has been a database error (invalid status value in respondinvitation.php)");
    }

    
//We want there to be two rows in the gameusermapid,
    //one with our userid, one with the other userid,
    //and with a common gameid. 

    //Let's look for that.
    
$sQueryFindRecord "SELECT gameusermap.gameusermapid, gameusermap2.gameusermapid AS gameusermapid2 FROM gameusermap INNER JOIN gameusermap AS gameusermap2 ON gameusermap.gameid = gameusermap2.gameid WHERE gameusermap.invitationstatus <> 'finished' AND gameusermap2.invitationstatus <> 'finished' AND gameusermap.userid = ".$_SESSION['userid']." AND gameusermap2.userid = ".$sOtherUserId;

    
$sGameUserMapId '-1';

    
queryDatabase($sQueryFindRecordoutputFindRecordRow);

     
//If we didn't find those records
     
if ($sGameUserMapId == '-1')
     {
          
//Then let's add them: together with a corresponding row
          //in the game table.

          
global $sOtherUserId;

          
$sAddGameQuery "INSERT INTO `game` ( `gameid` ) VALUES (NULL)";

          
$sGameId updateDatabase($sAddGameQuery);

          
//Note that, with this entry, we add the invitationstatus we've
          //been passed
          
$sAddMyGameUserMap "INSERT INTO `gameusermap` ( `gameusermapid` , `gameid`, `userid`, `invitationstatus` ) VALUES (NULL, '".$sGameId."', '".$_SESSION['userid']."', '".$sNewStatus."')";

          
updateDatabase($sAddMyGameUserMap);

          
$sAddTheirGameUserMap "INSERT INTO `gameusermap` ( `gameusermapid` , `gameid`, `userid`, `invitationstatus` ) VALUES (NULL, '".$sGameId."', '".$sOtherUserId."', 'unconfirmed')";

          
updateDatabase($sAddTheirGameUserMap );
     }
     else
     {
          global 
$sNewStatus;
          global 
$sGameUserMapId;

          
//We've found the corresponding records. So just change the
          //invitation status of the gameusermap record corresponding
          //to our userid
          
$sUpdateQuery "UPDATE `gameusermap` SET `invitationstatus` = '".$sNewStatus."' WHERE `gameusermapid` =".$sGameUserMapId;
          
          
updateDatabase($sUpdateQuery);
     }

    
//Finally, this query will return the new
    //invitation state in an XML tree
    
queryDatabase($sGetUsersQueryoutputRow);

     
//This is a callback function, used above
     
function outputFindRecordRow($rowOutput)
     {
          global 
$sGameUserMapId ;

          
$sGameUserMapId $rowOutput['gameusermapid'];
     }

     
closeDatabase();
?>
</root>