Admin: Summary table
[elbandi:minifaucet.git] / core.php
1 <?php
2
3 if (version_compare(PHP_VERSION, '5.3.0') < 0) {
4     exit("Sorry, this version of MiniFaucet will only run on PHP version 5.3 or greater!\n");
5 }
6
7 require_once 'config.php';
8 require_once 'coindata.php';
9 require_once 'recaptchalib.php';
10 require_once 'validator.php';
11 require_once 'Coinbase/Coinbase.php';
12 require_once 'jsonRPCClient.php';
13 require_once 'Slim/Slim.php';
14
15 define("COIN_NAME", getCoinName($coinType));
16 define("UP_COIN_NAME", ucfirst(COIN_NAME));
17 define("SUB_UNIT", getSubunitDivider($coinType));
18 define("SUB_UNIT_NAME", getSubunitName($coinType));
19
20 function urlFor($name, $params = array(), $appName = 'default')
21 {
22     return \Slim\Slim::getInstance($appName)->urlFor($name, $params);
23 }
24
25 function getAd($arr)
26 {
27     return !empty($arr) ? $arr[rand(0, count($arr)-1)] : "banner here\n";
28 }
29
30 function relative_time($date)
31 {
32     $diff = time() - $date;
33     $poststr = $diff > 0 ? " ago" : "";
34     $adiff = abs($diff);
35     if ($adiff<60) {
36         return $adiff . " second" . plural($adiff) . $poststr;
37     }
38     if ($adiff<3600) { // 60*60
39             return round($adiff/60) . " minute" . plural($adiff) . $poststr;
40     }
41     if ($adiff<86400) { // 24*60*60
42             return round($adiff/3600) . " hour" . plural($adiff) . $poststr;
43     }
44     if ($adiff<604800) { // 7*24*60*60
45             return round($adiff/86400) . " day" . plural($adiff) . $poststr;
46     }
47     if ($adiff<2419200) { // 4*7*24*60*60
48             return $adiff . " week" . plural($adiff) . $poststr;
49     }
50     return "on " . date("F j, Y", strtotime($date));
51 }
52
53 function plural($a)
54 {
55         return ($a > 1 ? "s" : "");
56 }
57
58 function checkaddress($address)
59 {
60     global $allowEmail, $allowCoin, $coinType;
61     if ($allowCoin && determineValidity($address, $coinType)) {
62         return true;
63     }
64     if ($allowEmail && (filter_var($address, FILTER_VALIDATE_EMAIL) !== false)) {
65         return true;
66     }
67     return false;
68 }
69
70 function getIP()
71 {
72     if (getenv("HTTP_CLIENT_IP")) {
73         $ip = getenv("HTTP_CLIENT_IP");
74     } elseif (getenv("HTTP_X_FORWARDED_FOR")) {
75         $ip = getenv("HTTP_X_FORWARDED_FOR");
76     } elseif (getenv("REMOTE_ADDR")) {
77         $ip = getenv("REMOTE_ADDR");
78     } else {
79         $ip = "UNKNOWN";
80     }
81     return $ip;
82 }
83
84 function getserverbalance($force = false)
85 {
86     global $apiKey, $guid, $rpchost;
87     if (!$force) {
88         // we store the server balance in sql with a spec address called 'SERVERBALANCE'
89         $balance_sql = "SELECT balance FROM balances WHERE email='SERVERBALANCE' ";
90         $balance_sql .= "AND totalbalance > ".(time() - 1800).";";
91         $balance_query = sql_query($balance_sql);
92         if ($balance_query->num_rows) {
93             $balance = fetch_one($balance_query);
94             return $balance;
95         }
96     }
97     try {
98         if (!empty($apiKey)) {
99             $balance = getCoinbaseBalance();
100         } elseif (!empty($guid)) {
101             $balance = getBlockchainBalance();
102         } elseif (!empty($rpchost)) {
103             $balance = getBitcoindBalance();
104         } else {
105             $balance = -1;
106         }
107         $date = time();
108         $insert_sql = "INSERT INTO balances(balance, totalbalance, email, referredby) ";
109         $insert_sql .= "VALUES($balance, '$date', 'SERVERBALANCE', 0) ON DUPLICATE KEY ";
110         $insert_sql .= "UPDATE balance = $balance, totalbalance = '$date';";
111         sql_query($insert_sql);
112         return $balance;
113     } catch (Exception $e) {
114         return 0;
115     }
116 }
117
118 function getCoinbaseBalance()
119 {
120     global $apiKey;
121     $coinbase = new Coinbase($apiKey);
122     return $coinbase->getBalance() * SUB_UNIT;
123 }
124
125 function getBlockchainBalance()
126 {
127     global $guid, $firstpassword;
128     $url = "https://blockchain.info/merchant/$guid/balance?password=$firstpassword";
129     return json_decode(file_get_contents($url))->balance;
130 }
131
132 function getBitcoindBalance()
133 {
134     global $rpchost, $rpcssl, $rpcport, $rpcuser, $rpcpassword;
135     $bitcoin = new jsonRPCClient(sprintf('http%s://%s:%s@%s:%d/', $rpcssl ? "s" : "", $rpcuser, $rpcpassword, $rpchost, $rpcport));
136     return $bitcoin->getbalance() * SUB_UNIT;
137 }
138
139 class NoCashException extends Exception
140 {
141 }
142
143 function sendMoney($address, $balance)
144 {
145     global $apiKey, $guid, $rpchost;
146     if (!empty($apiKey)) {
147         return sendCoinbaseMoney($address, $balance);
148     } elseif (!empty($guid)) {
149         return sendBlockchainMoney($address, $balance);
150     } elseif (!empty($rpchost)) {
151         return sendBitcoindMoney($address, $balance);
152     } else {
153         throw new Exception("The site doesnt set wallet provider");
154     }
155 }
156
157 function sendCoinbaseMoney($address, $balance)
158 {
159     global $apiKey, $cashoutMessage, $fee;
160     $balance = $balance / SUB_UNIT;
161     try {
162         $coinbase = new Coinbase($apiKey);
163         $response = $coinbase->sendMoney($address, sprintf("%.8f", $balance), $cashoutMessage, $fee > 0 ? ($fee / SUB_UNIT) : null);
164     } catch (Exception $e) {
165         $response = $e->getMessage();
166         if (strpos($response, "You don't have that much") !== false) {
167             throw new NoCashException($response, 0, $e);
168         } else {
169             throw new Exception($response, 0, $e);
170         }
171     }
172     return $response;
173 }
174
175 function sendBlockchainMoney($address, $balance)
176 {
177     global $guid, $firstpassword, $secondpassword, $cashoutMessage, $fee;
178
179     $url = "https://blockchain.info/merchant/$guid/payment?";
180     $url .= "password=$firstpassword&second_password=$secondpassword&to=$address&amount=$balance&";
181     if ($fee >= 50000) {
182         $url .= "fee=$fee";
183     }
184     $url .= "note=" . urlencode($cashoutMessage);
185     $response = json_decode(file_get_contents($url));
186     if (isset($response->error)) {
187         if ($response->error == 'No free outputs to spend') {
188             throw new NoCashException();
189         } else {
190             throw new Exception($response->error);
191         }
192     }
193     return $response;
194 }
195
196 function sendBitcoindMoney($address, $balance)
197 {
198     global $rpchost, $rpcssl, $rpcport, $rpcuser, $rpcpassword, $cashoutMessage, $fee;
199     $balance = $balance / SUB_UNIT;
200     try {
201         $bitcoin = new jsonRPCClient(sprintf('http%s://%s:%s@%s:%d/', $rpcssl ? "s" : "", $rpcuser, $rpcpassword, $rpchost, $rpcport));
202         if ($fee > 0) {
203             $bitcoin->settxfee(round($fee / SUB_UNIT, 8));
204         }
205         $response = $bitcoin->sendtoaddress($address, $balance, $cashoutMessage);
206     } catch (Exception $e) {
207         $response = $e->getMessage();
208         if (strpos($response, "Insufficient funds") !== false) {
209             throw new NoCashException($response, 0, $e);
210         } else {
211             throw new Exception($response, 0, $e);
212         }
213     }
214     return $response;
215 }
216
217 function sql_query($sql)
218 {
219     global $mysqli;
220     return $mysqli->query($sql);
221 }
222
223 function fetch_row($query)
224 {
225     return $query->fetch_row();
226 }
227
228 function fetch_assoc($query)
229 {
230     return $query->fetch_assoc();
231 }
232
233 function fetch_all($query, $resulttype = MYSQLI_NUM)
234 {
235     if (method_exists($query, 'fetch_all')) { # Compatibility layer with PHP < 5.3
236         $res = $query->fetch_all($resulttype);
237     } else {
238         for ($res = array(); $tmp = $query->fetch_array($resulttype);) {
239             $res[] = $tmp;
240         }
241     }
242     return $res;
243 }
244
245 function fetch_one($query)
246 {
247     $row = $query->fetch_row();
248     return $row[0];
249 }