-// Getter fro ref level percents
-function getReferalLevelPercents ($level) {
- // Default is zero
- $data['percents'] = '0';
-
- // Do we have cache?
- if ((isset($GLOBALS['cache_array']['refdepths']['level'])) && (isExtensionActive('cache'))) {
- // First look for level
- $key = array_search($level, $GLOBALS['cache_array']['refdepths']['level']);
- if ($key !== false) {
- // Entry found
- $data['percents'] = $GLOBALS['cache_array']['refdepths']['percents'][$key];
-
- // Count cache hit
- incrementStatsEntry('cache_hits');
- } // END - if
- } elseif (!isExtensionActive('cache')) {
- // Get referal data
- $result_level = SQL_QUERY_ESC("SELECT `percents` FROM `{?_MYSQL_PREFIX?}_refdepths` WHERE `level`='%s' LIMIT 1",
- array(bigintval($level)), __FUNCTION__, __LINE__);
-
- // Entry found?
- if (SQL_NUMROWS($result_level) == 1) {
- // Get percents
- $data = SQL_FETCHARRAY($result_level);
- } // END - if
-
- // Free result
- SQL_FREERESULT($result_level);
- }
-
- // Return percent
- return $data['percents'];
-}
-
-/**
- *
- * Dynamic referal system, can also send mails!
- *
- * subject = Subject line, write in lower-case letters and underscore is allowed
- * userid = Referal id wich should receive...
- * points = ... xxx points
- * sendNotify = shall I send the referal an email or not?
- * refid = inc/modules/guest/what-confirm.php need this
- * locked = Shall I pay it to normal (false) or locked (true) points ammount?
- * add_mode = Add points only to $userid or also refs? (WARNING! Changing 'ref' to 'direct'
- * for default value will cause no referal will get points ever!!!)
- */
-function addPointsThroughReferalSystem ($subject, $userid, $points, $sendNotify = false, $refid = '0', $add_mode = 'ref') {
- // By default nothing has been added
- $added = false;
-
- //* DEBUG: */ debugOutput('----------------------- <font color="#00aa00">' . __FUNCTION__ . ' - ENTRY</font> ------------------------<ul><li>');
- // Convert mode to lower-case
- $add_mode = strtolower($add_mode);
-
- // When $userid = '0' add points to jackpot
- if (($userid == '0') && (isExtensionActive('jackpot'))) {
- // Add points to jackpot
- addPointsToJackpot($points);
- return;
- } // END - if
-
- // Count up referal depth
- if (!isset($GLOBALS['ref_level'])) {
- // Initialialize referal system
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>): Referal system initialized!');
- $GLOBALS['ref_level'] = '0';
- } else {
- // Increase referal level
- $GLOBALS['ref_level']++;
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>): Referal level increased. DEPTH='.$GLOBALS['ref_level']);
- }
-
- // Check user account
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',points='.$points);
- if (fetchUserData($userid)) {
- // Determine wether the user has some mails to click before he/she gets the points
- $locked = ifUserPointsLocked($userid);
-
- // Default is 'normal' points
- $data = 'points';
-
- // Which points, locked or normal?
- if ($locked === true) {
- $data = 'locked_points';
- } // END - if
-
- // This is the user and his ref
- $GLOBALS['cache_array']['add_userid'][getUserData('refid')] = $userid;
-
- // Get percents
- $per = getReferalLevelPercents($GLOBALS['ref_level']);
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',points='.$points.',depth='.$GLOBALS['ref_level'].',per='.$per.',mode='.$add_mode);
-
- // Some percents found?
- if ($per > 0) {
- // Calculate new points
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',points='.$points.',per='.$per.',depth='.$GLOBALS['ref_level']);
- $ref_points = $points * $per / 100;
-
- // Pay refback here if level > 0 and in ref-mode
- if ((isExtensionActive('refback')) && ($GLOBALS['ref_level'] > 0) && ($per < 100) && ($add_mode == 'ref') && (isset($GLOBALS['cache_array']['add_userid'][$userid]))) {
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',data='.$GLOBALS['cache_array']['add_userid'][$userid].',ref_points='.$ref_points.',depth='.$GLOBALS['ref_level'].' - BEFORE!');
- $ref_points = addRefbackPoints($GLOBALS['cache_array']['add_userid'][$userid], $userid, $points, $ref_points);
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',data='.$GLOBALS['cache_array']['add_userid'][$userid].',ref_points='.$ref_points.',depth='.$GLOBALS['ref_level'].' - AFTER!');
- } // END - if
-
- // Update points...
- SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_user_points` SET `%s`=`%s`+%s WHERE `userid`=%s AND `ref_depth`=%s LIMIT 1",
- array($data, $data, $ref_points, bigintval($userid), bigintval($GLOBALS['ref_level'])), __FUNCTION__, __LINE__);
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):data='.$data.',ref_points='.$ref_points.',userid='.$userid.',depth='.$GLOBALS['ref_level'].',mode='.$add_mode.' - UPDATE! ('.SQL_AFFECTEDROWS().')');
-
- // No entry updated?
- if (SQL_HASZEROAFFECTED()) {
- // First ref in this level! :-)
- SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_user_points` (`userid`,`ref_depth`,`%s`) VALUES (%s,%s,%s)",
- array($data, bigintval($userid), bigintval($GLOBALS['ref_level']), $ref_points), __FUNCTION__, __LINE__);
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):data='.$data.',ref_points='.$ref_points.',userid='.$userid.',depth='.$GLOBALS['ref_level'].',mode='.$add_mode.' - INSERTED! ('.SQL_AFFECTEDROWS().')');
- } // END - if
-
- // Check affected rows
- $added = SQL_AFFECTEDROWS();
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):added='.intval($added));
-
- // Prepare data for the filter
- $filterData = array(
- 'subject' => $subject,
- 'userid' => $userid,
- 'points' => $points,
- 'notify' => $sendNotify,
- 'refid' => $refid,
- 'locked' => $locked,
- 'mode' => 'add',
- 'sub_mode' => $add_mode,
- 'added' => $added
- );
-
- // Filter it now
- $filterData = runFilterChain('add_points', $filterData);
-
- // Extract $added
- $added = $filterData['added'];
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):added='.intval($added));
-
- // Points updated, maybe I shall send him an email?
- if (($sendNotify === true) && (isValidUserId(getUserData('refid'))) && ($locked === false)) {
- // Prepare content
- $content = array(
- 'percents' => $per,
- 'level' => bigintval($GLOBALS['ref_level']),
- 'points' => $ref_points,
- );
-
- // Load email template
- $message = loadEmailTemplate('confirm-referal', $content, bigintval($userid));
-
- // Send email
- sendEmail($userid, '{--THANX_REFERAL_ONE_SUBJECT--}', $message);
- } elseif (($sendNotify === true) && (!isValidUserId(getUserData('refid'))) && ($locked === false) && ($add_mode == 'direct')) {
- // Prepare content
- $content = array(
- 'reason' => '{--REASON_DIRECT_PAYMENT--}',
- 'points' => $ref_points
- );
-
- // Load message
- $message = loadEmailTemplate('add-points', $content, $userid);
-
- // And sent it away
- sendEmail($userid, '{--DIRECT_PAYMENT_SUBJECT--}', $message);
- if (!isGetRequestParameterSet('mid')) {
- // Output message to admin
- loadTemplate('admin_settings_saved', false, '{--ADMIN_POINTS_ADDED--}');
- } // END - if
- }
-
- // Maybe there's another ref?
- if ((isValidUserId(getUserData('refid'))) && ($points > 0) && (getUserData('refid') != $userid) && ($add_mode == 'ref')) {
- // Then let's credit him here...
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',ref='.getUserData('refid').',points='.$points.' - ADVANCE!');
- $added = ($added && addPointsThroughReferalSystem(sprintf("%s_ref:%s", $subject, $GLOBALS['ref_level']), getUserData('refid'), $points, $sendNotify, getUserData('refid')));
- } // END - if
- } // END - if
- } // END - if
-
- //* DEBUG: */ debugOutput('</li></ul>----------------------- <font color="#aa0000">'.__FUNCTION__.': added=' . intval($added) . ' - EXIT</font> ------------------------<br />');
- return $added;
-}
-
-// Updates the referal counter
-function updateReferalCounter ($userid) {
- // Make it sure referal level zero (member him-/herself) is at least selected
- if (empty($GLOBALS['cache_array']['ref_level'][$userid])) $GLOBALS['cache_array']['ref_level'][$userid] = 1;
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',level='.$GLOBALS['cache_array']['ref_level'][$userid]);
-
- // Update counter
- SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_refsystem` SET `counter`=`counter`+1 WHERE `userid`=%s AND `level`='%s' LIMIT 1",
- array(bigintval($userid), $GLOBALS['cache_array']['ref_level'][$userid]), __FUNCTION__, __LINE__);
-
- // When no entry was updated then we have to create it here
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):updated=' . SQL_AFFECTEDROWS());
- if (SQL_HASZEROAFFECTED()) {
- // First count!
- SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_refsystem` (`userid`, `level`, `counter`) VALUES (%s,%s,1)",
- array(
- bigintval($userid),
- $GLOBALS['cache_array']['ref_level'][$userid]
- ), __FUNCTION__, __LINE__);
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid);
- } // END - if
-
- // Init referal id
- $ref = '0';
-
- // Check for his referal
- if (fetchUserData($userid)) {
- // Get it
- $ref = getUserData('refid');
- } // END - if
-
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):userid='.$userid.',ref='.$ref);
-
- // When he has a referal...
- if (($ref > 0) && ($ref != $userid)) {
- // Move to next referal level and count his counter one up!
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):ref='.$ref.' - ADVANCE!');
- $GLOBALS['cache_array']['ref_level'][$userid]++;
- updateReferalCounter($ref);
- } elseif ((($ref == $userid) || ($ref == '0')) && (isExtensionInstalledAndNewer('cache', '0.1.2'))) {
- // Remove cache here
- //* DEBUG: */ debugOutput(__FUNCTION__ . '(<font color="#0000aa">' . __LINE__ . '</font>):ref='.$ref.' - CACHE!');
- rebuildCache('refsystem', 'refsystem');
- }
-
- // "Walk" back here
- $GLOBALS['cache_array']['ref_level'][$userid]--;
-
- // Handle refback here if extension is installed
- // @TODO Rewrite this to a filter
- if (isExtensionActive('refback')) {
- updateRefbackTable($userid);
- } // END - if
-}