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