function sendPM(User $FromUser, $message) { $message = htmlentities($message, ENT_NOQUOTES, 'UTF-8'); require_once l_r('lib/message.php'); $message = message::linkify($message); if ($FromUser->isSilenced()) { notice::send($FromUser->id, $this->id, 'PM', 'No', 'Yes', l_t('Could not deliver message, you are currently silenced.') . '(' . $FromUser->getActiveSilence()->reason . ')', l_t('To:') . ' ' . $this->username, $this->id); return false; } else { if ($this->isUserMuted($FromUser->id)) { notice::send($FromUser->id, $this->id, 'PM', 'No', 'Yes', l_t('Could not deliver message, user has muted you.'), l_t('To:') . ' ' . $this->username, $this->id); return false; } else { notice::send($this->id, $FromUser->id, 'PM', 'Yes', 'Yes', $message, $FromUser->username, $FromUser->id); $this->setNotification('PrivateMessage'); notice::send($FromUser->id, $this->id, 'PM', 'No', 'Yes', l_t('You sent:') . ' <em>' . $message . '</em>', l_t('To:') . ' ' . $this->username, $this->id); return true; } } }
public function cancelGame(array $params) { global $DB, $Game; $gameID = (int) $params['gameID']; $DB->sql_put("BEGIN"); require_once l_r('gamemaster/game.php'); $Variant = libVariant::loadFromGameID($gameID); $Game = $Variant->processGame($gameID); if ($Game->phase == 'Diplomacy' or $Game->phase == 'Retreats' or $Game->phase == 'Builds') { $Game->setCancelled(); // This throws an exception, since it expects to be run from within the // main gamemaster loop, and wants to stop the loop from continuing to use this game after // it has been cancelled. But it also contains its own commit, so the exception does not prevent // the game from being cancelled (it is messy though). // This point after $Game->setCancelled(); shouldn't actually be reached. } elseif ($Game->phase == 'Finished') { /* * Some special action is needed; this game has already finished. * * We need to get back all winnings that have been distributed first, then we need to * return all starting bets. */ $transactions = array(); $sumPoints = 0; // Used to ensure the total points transactions add up roughly to 0 $tabl = $DB->sql_tabl("SELECT type, points, userID, memberID FROM wD_PointsTransactions WHERE gameID = " . $Game->id . " FOR UPDATE"); // Lock it for update, so other transactions can't interfere with these ones while (list($type, $points, $userID, $memberID) = $DB->tabl_row($tabl)) { if (!isset($transactions[$userID])) { $transactions[$userID] = array(); } if (!isset($transactions[$userID][$type])) { $transactions[$userID][$type] = 0; } if ($type != 'Bet') { $points = $points * -1; } // Bets are to be credited back, everything else is to be debited if ($type != 'Supplement') { $sumPoints += $points; } $transactions[$userID][$type] += $points; } // Check that the total points transactions within this game make sense (i.e. they add up to roughly 0 accounting for rounding errors) if ($sumPoints < count($transactions) * -1 or count($transactions) < $sumPoints) { throw new Exception(l_t("The total points transactions (in a finished game) add up to %s, but there are %s members; " . "cannot cancel game with an unusual points transaction log.", $sumPoints, count($transactions)), 274); } // The points transactions make sense; we can now try and reverse them. // Get the current points each user has $tabl = $DB->sql_tabl("SELECT u.id, u.points FROM wD_Users u INNER JOIN wD_PointsTransactions pt ON pt.userID = u.id WHERE pt.gameID = " . $Game->id . " GROUP BY u.id, u.points " . " FOR UPDATE"); // Lock it for update, so other transactions can't interfere with these ones $pointsInAccount = array(); $pointsInPlay = array(); while (list($userID, $points) = $DB->tabl_row($tabl)) { $sumPoints = 0; foreach ($transactions[$userID] as $type => $typePoints) { $sumPoints += $typePoints; } if ($points + $sumPoints < 0) { // If the user doesn't have enough points on hand to pay back the points transactions for this game we will need to supplement him the points to do it: $supplementPoints = -($points + $sumPoints); $points += $supplementPoints; $DB->sql_put("INSERT INTO wD_PointsTransactions ( type, points, userID, gameID ) VALUES ( 'Supplement', " . $supplementPoints . ", " . $userID . ", " . $Game->id . ")"); $DB->sql_put("UPDATE wD_Users SET points = " . $points . " WHERE id = " . $userID); } // Now we have given the user enough points so their points transactions for this game can definitely be undone: $DB->sql_put("INSERT INTO wD_PointsTransactions ( type, points, userID, gameID ) VALUES ( 'Correction', " . $sumPoints . ", " . $userID . ", " . $Game->id . ")"); $points += $sumPoints; $DB->sql_put("UPDATE wD_Users SET points = " . $points . " WHERE id = " . $userID); // Now check that they don't need a supplement to bring their total points in play back up to 100: $pointsInPlay = User::pointsInPlay($userID); if ($points + $pointsInPlay < 100) { $supplementPoints = 100 - ($points + $pointsInPlay); $points += $supplementPoints; $DB->sql_put("INSERT INTO wD_PointsTransactions ( type, points, userID, gameID ) VALUES ( 'Supplement', " . $supplementPoints . ", " . $userID . ", " . $Game->id . ")"); $DB->sql_put("UPDATE wD_Users SET points = " . $points . " WHERE id = " . $userID); } notice::send($userID, $Game->id, 'Game', 'No', 'No', l_t("This game has been cancelled after having finished (usually to undo the effects of cheating). " . "%s points had to be added/taken from your account to undo the effects of the game. " . "Please contact the mod team with any queries.", $sumPoints, $points), $Game->name, $Game->id); } // Now backup and erase the game from existence, then commit: processGame::eraseGame($Game->id); } else { throw new Exception(l_t('This game is in phase %s, so it can\'t be cancelled', $Game->phase), 987); } // $DB->sql_put("COMMIT"); // $ return l_t('This game was cancelled.'); }
function send($keep, $private, $text, $fromCountryID = null) { notice::send($this->userID, $this->gameID, 'Game', $keep, $private, $text, $this->Game->name, $this->gameID); }
function sendToWatchers($keep, $text) { global $DB; $tabl = $DB->sql_tabl('SELECT userID FROM wD_WatchedGames WHERE gameID=' . $this->Game->id); while ($watch = $DB->tabl_hash($tabl)) { notice::send($watch['userID'], $this->Game->id, 'Game', $keep, 'No', $text, $this->Game->name, $this->Game->id); } }