Code rewritings, load base config improved and many minor fixes...
[mailer.git] / 0.2.1 / inc / autopurge.php
1 <?php\r
2 /************************************************************************\r
3  * MXChange v0.2.1                                    Start: 05/29/2004 *\r
4  * ===============                              Last change: 11/26/2004 *\r
5  *                                                                      *\r
6  * -------------------------------------------------------------------- *\r
7  * File              : autopurge.php                                    *\r
8  * -------------------------------------------------------------------- *\r
9  * Short description : Automatical purging of outdated mail links       *\r
10  * -------------------------------------------------------------------- *\r
11  * Kurzbeschreibung  : Auto-Loeschung von veralteten Mail-Links         *\r
12  * -------------------------------------------------------------------- *\r
13  *                                                                      *\r
14  * -------------------------------------------------------------------- *\r
15  * Copyright (c) 2003 - 2008 by Roland Haeder                           *\r
16  * For more information visit: http://www.mxchange.org                  *\r
17  *                                                                      *\r
18  * This program is free software; you can redistribute it and/or modify *\r
19  * it under the terms of the GNU General Public License as published by *\r
20  * the Free Software Foundation; either version 2 of the License, or    *\r
21  * (at your option) any later version.                                  *\r
22  *                                                                      *\r
23  * This program is distributed in the hope that it will be useful,      *\r
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *\r
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *\r
26  * GNU General Public License for more details.                         *\r
27  *                                                                      *\r
28  * You should have received a copy of the GNU General Public License    *\r
29  * along with this program; if not, write to the Free Software          *\r
30  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               *\r
31  * MA  02110-1301  USA                                                  *\r
32  ************************************************************************/\r
33 \r
34 // Some security stuff...\r
35 if (ereg(basename(__FILE__), $_SERVER['PHP_SELF']))\r
36 {\r
37         $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4) . "/security.php";\r
38         require($INC);\r
39 }\r
40 \r
41 if (($CONFIG['auto_purge_active'] == "Y") && ($CONFIG['auto_purge'] > 0))\r
42 {\r
43         // First calculate the timestamp\r
44         if (function_exists('CREATE_TIME_SELECTIONS'))\r
45         {\r
46                 $PURGE = time() - $CONFIG['auto_purge'];\r
47         }\r
48          else\r
49         {\r
50                 $PURGE = time() - $CONFIG['auto_purge'] * 24 * 60 * 60;\r
51         }\r
52 \r
53         // Init variables\r
54         $admin_points = "0";\r
55 \r
56         // Then check for outdated mail order. We don't delete them just the confirmation links will be deleted.\r
57         $result = SQL_QUERY_ESC("SELECT s.id, s.userid, s.pool_id, t.price\r
58 FROM "._MYSQL_PREFIX."_user_stats AS s\r
59 LEFT JOIN "._MYSQL_PREFIX."_payments AS t\r
60 ON s.payment_id=t.id\r
61 WHERE s.timestamp_ordered <= %s ORDER BY s.userid",\r
62          array(bigintval($PURGE)), __FILE__, __LINE__);\r
63         if (SQL_NUMROWS($result) > 0)\r
64         {\r
65                 // Start deleting procedure\r
66                 $uid = "0"; $points = "0";\r
67                 while(list($mid, $sender, $pool, $price) = SQL_FETCHROW($result))\r
68                 {\r
69                         // Check if confirmation links are purged or not\r
70                         $result_links = SQL_QUERY_ESC("SELECT id FROM "._MYSQL_PREFIX."_user_links WHERE stats_id=%d LIMIT 1",\r
71                          array(bigintval($mid)), __FILE__, __LINE__);\r
72                         if (SQL_NUMROWS($result_links) == 1)\r
73                         {\r
74                                 // Free memory\r
75                                 SQL_FREERESULT($result_links);\r
76 \r
77                                 // At least one link was found, enougth to pay back the points\r
78                                 if (($uid != $sender) && ($uid > 0) && ($points > 0))\r
79                                 {\r
80                                         // Directly add points back to senders account\r
81                                         AUTOPURGE_ADD_POINTS($uid, $points);\r
82                                         $points = "0";\r
83                                 }\r
84                                 // Add points\r
85                                 $uid = $sender; $points += $price; $admin_points += $price;\r
86 \r
87                                 // Remove confirmation links from queue\r
88                                 $result_del = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_user_links WHERE stats_id=%d",\r
89                                  array(bigintval($mid)), __FILE__, __LINE__);\r
90 \r
91                                 // Update status of order\r
92                                 $result_update = SQL_QUERY_ESC("UPDATE "._MYSQL_PREFIX."_pool SET data_type='DELETED' WHERE id=%d LIMIT 1",\r
93                                  array(bigintval($pool)), __FILE__, __LINE__);\r
94                         }\r
95                 }\r
96 \r
97                 // Add last points to last user account\r
98                 if ($points > 0) AUTOPURGE_ADD_POINTS($uid, $points);\r
99         }\r
100 \r
101         // Free memory\r
102         SQL_FREERESULT($result);\r
103 \r
104         // Is the 'bonus' extension installed and activated?\r
105         if (EXT_IS_ACTIVE("bonus", true))\r
106         {\r
107                 // Check for bonus campaigns\r
108                 $result = SQL_QUERY_ESC("SELECT id, points FROM "._MYSQL_PREFIX."_bonus WHERE data_type='SEND' AND timestamp <= %s ORDER BY id",\r
109                  array(bigintval($PURGE)), __FILE__, __LINE__);\r
110                 if (SQL_NUMROWS($result) > 0)\r
111                 {\r
112                         // Start deleting procedure\r
113                         $points = "0";\r
114                         while (list($bid, $price) = SQL_FETCHROW($result))\r
115                         {\r
116                                 // Check if confirmation links are purged or not\r
117                                 $result_links = SQL_QUERY_ESC("SELECT id FROM "._MYSQL_PREFIX."_user_links WHERE bonus_id=%d",\r
118                                  array(bigintval($bid)), __FILE__, __LINE__);\r
119                                 if (SQL_NUMROWS($result_links) > 0)\r
120                                 {\r
121                                         // At least one link was found, enougth to pay back the points\r
122                                         $points += $price * SQL_NUMROWS($result_links);\r
123 \r
124                                         // Free memory\r
125                                         SQL_FREERESULT($result_links);\r
126 \r
127                                         // Remove confirmation links from queue\r
128                                         $result_del = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_user_links WHERE bonus_id=%d",\r
129                                          array(bigintval($bid)), __FILE__, __LINE__);\r
130 \r
131                                         // Update status of order\r
132                                         $result_update = SQL_QUERY_ESC("UPDATE "._MYSQL_PREFIX."_bonus SET data_type='DELETED' WHERE id=%d LIMIT 1",\r
133                                          array(bigintval($bid)), __FILE__, __LINE__);\r
134                                 }\r
135                         }\r
136 \r
137                         // Add points to jackpot\r
138                         ADD_JACKPOT($points);\r
139 \r
140                         // Add points for the admin\r
141                         $admin_points += $points;\r
142                 }\r
143 \r
144                 // Free memory\r
145                 SQL_FREERESULT($result);\r
146         }\r
147 \r
148         // Add points from deleted accounts to jackpot, but here just add to notify mail\r
149         if ($admin_points > 0)\r
150         {\r
151                 // Send mail to admin\r
152                 if (GET_EXT_VERSION("admins") >= "0.4.1")\r
153                 {\r
154                         SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_SUBJECT, "admin_autopurge_points", TRANSLATE_COMMA($points), "0");\r
155                 }\r
156                  else\r
157                 {\r
158                         $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_points", TRANSLATE_COMMA($points), "0");\r
159                         SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_SUBJECT, $msg);\r
160                 }\r
161         }\r
162 }\r
163 \r
164 // Shall I look for inactive accounts and autopurge inactive accounts?\r
165 if ($CONFIG['ap_inactive'] == "Y")\r
166 {\r
167         // Ok, let's have a look...\r
168         $since = bigintval(time() - $CONFIG['ap_in_since']);\r
169         $EXCLUDE_LIST = " AND d.userid != c.def_refid";\r
170 \r
171         // Check for more extensions\r
172         if (EXT_IS_ACTIVE("beg"))     $EXCLUDE_LIST .= " AND d.userid != c.beg_uid";\r
173         if (EXT_IS_ACTIVE("bonus"))   $EXCLUDE_LIST .= " AND d.userid != c.bonus_uid";\r
174         if (EXT_IS_ACTIVE("doubler")) $EXCLUDE_LIST .= " AND d.userid != c.doubler_uid";\r
175 \r
176         // Check for new holiday extension\r
177         if (GET_EXT_VERSION("holiday") >= "0.1.3")\r
178         {\r
179                 $EXCLUDE_LIST .= " AND d.holiday_active = 'N'";\r
180         }\r
181 \r
182         // Check for all accounts\r
183         $result_inactive = SQL_QUERY_ESC("SELECT DISTINCT d.userid, d.email, d.last_online\r
184 FROM "._MYSQL_PREFIX."_user_data AS d, "._MYSQL_PREFIX."_config AS c\r
185 WHERE d.status='CONFIRMED' AND d.joined < %s AND d.last_online < %s AND d.ap_notified < %s\r
186 ".$EXCLUDE_LIST."\r
187 ORDER BY d.userid", array($since, $since, $since), __FILE__, __LINE__);\r
188 \r
189         if (SQL_NUMROWS($result_inactive) > 0)\r
190         {\r
191                 // Prepare variables and constants...\r
192                 $UIDs = "";\r
193                 define('__INACTIVE_SINCE', ($CONFIG['ap_in_since'] / 60 / 60));\r
194                 define('__INACTIVE_TIME' , ($CONFIG['ap_in_time']  / 60 / 60));\r
195 \r
196                 // Mark found accounts as inactive and send an email\r
197                 while(list($uid, $email, $last) = SQL_FETCHROW($result_inactive))\r
198                 {\r
199                         // Remember userids for the admin\r
200                         $UIDs .= $uid.", ";\r
201 \r
202                         // Get date/time from timestamp\r
203                         $last = MAKE_DATETIME($last, "0");\r
204 \r
205                         // Load mail template\r
206                         $msg = LOAD_EMAIL_TEMPLATE("member_autopurge_inactive", $last, bigintval($uid));\r
207                         SEND_EMAIL($email, AUTOPURGE_MEMBER_INACTIVE_SUBJECT, $msg);\r
208 \r
209                         // Update this account\r
210                         $result_update = SQL_QUERY_ESC("UPDATE "._MYSQL_PREFIX."_user_data SET ap_notified=UNIX_TIMESTAMP() WHERE userid=%d LIMIT 1",\r
211                          array(bigintval($uid)), __FILE__, __LINE__);\r
212                 }\r
213 \r
214                 // Remove last comma\r
215                 $UIDs = str_replace(", ", "\n", substr($UIDs, 0, -2));\r
216 \r
217                 // Send mail notification to admin\r
218                 if (GET_EXT_VERSION("admins") >= "0.4.1")\r
219                 {\r
220                         SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_INACTIVE_SUBJECT, "admin_autopurge_inactive", $UIDs, "");\r
221                 }\r
222                  else\r
223                 {\r
224                         $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_inactive", $UIDs, "");\r
225                         SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_INACTIVE_SUBJECT, $msg);\r
226                 }\r
227         }\r
228 \r
229         // Free memory\r
230         SQL_FREERESULT($result_inactive);\r
231 \r
232         // Now let's have a look for inactive accounts we want to delete we newly use the same exclude list\r
233         // here for e.g. excluding holiday users\r
234         $time = bigintval(time() - $CONFIG['ap_in_time']);\r
235         $result_inactive = SQL_QUERY_ESC("SELECT d.userid, d.email, d.last_online\r
236 FROM "._MYSQL_PREFIX."_user_data AS d, "._MYSQL_PREFIX."_config AS c\r
237 WHERE status='CONFIRMED' AND joined < %s AND last_online< %s AND ap_notified < %s\r
238 ".$EXCLUDE_LIST."\r
239 ORDER BY userid",\r
240          array($since, $since, $time), __FILE__, __LINE__);\r
241         if (SQL_NUMROWS($result_inactive) > 0)\r
242         {\r
243                 // Prepare variable...\r
244                 $UIDs = "";\r
245 \r
246                 // Delete inactive accounts\r
247                 while (list($uid, $email, $last) = SQL_FETCHROW($result_inactive))\r
248                 {\r
249                         // Remember userids for the admin\r
250                         $UIDs .= $uid.", ";\r
251 \r
252                         // Get date/time from timestamp\r
253                         $last = MAKE_DATETIME($last, "0");\r
254 \r
255                         // Finnaly delete this inactive account\r
256                         DELETE_USER_ACCOUNT(bigintval($uid), LOAD_EMAIL_TEMPLATE("member_autopurge_delete", $last, ""));\r
257                 }\r
258 \r
259                 // Remove last comma\r
260                 $UIDs = str_replace(", ", "\n", substr($UIDs, 0, -2));\r
261 \r
262                 // Send mail notification to admin\r
263                 if ($CONFIG['ap_un_mail'] == "Y")\r
264                 {\r
265                         if (GET_EXT_VERSION("admins") >= "0.4.1")\r
266                         {\r
267                                 SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_DELETE_SUBJECT, "admin_autopurge_delete", $UIDs, "");\r
268                         }\r
269                          else\r
270                         {\r
271                                 $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_delete", $UIDs, "");\r
272                                 SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_DELETE_SUBJECT, $msg);\r
273                         }\r
274                 }\r
275         }\r
276 \r
277         // Free memory\r
278         SQL_FREERESULT($result_inactive);\r
279 }\r
280 \r
281 // Shall I auto-purge unconfirmed accounts?\r
282 if ($CONFIG['ap_unconfirmed'] == "Y")\r
283 {\r
284         // Init variables and find unconfirmed accounts which I shall auto-purge\r
285         $time = bigintval(time() - $CONFIG['ap_un_time']);\r
286         $result_uncon = SQL_QUERY_ESC("SELECT userid, email, joined FROM "._MYSQL_PREFIX."_user_data WHERE status='UNCONFIRMED' AND joined < %s ORDER BY userid",\r
287          array($time), __FILE__, __LINE__);\r
288         if (SQL_NUMROWS($result_uncon) > 0)\r
289         {\r
290                 // Prepare variable...\r
291                 $UIDs = "";\r
292                 define('__UNCONFIRMED_TIME' , ($CONFIG['ap_un_time']  / 60 / 60));\r
293 \r
294                 // Delete inactive accounts\r
295                 while (list($uid, $email, $joined) = SQL_FETCHROW($result_uncon))\r
296                 {\r
297                         // Remember userids for the admin\r
298                         $UIDs .= $uid.", ";\r
299 \r
300                         // Get date/time from timestamp\r
301                         $joined = MAKE_DATETIME($joined, "0");\r
302 \r
303                         // Finnaly delete this inactive account\r
304                         DELETE_USER_ACCOUNT($uid, LOAD_EMAIL_TEMPLATE("member_autopurge_unconfirmed", $joined, ""));\r
305                 }\r
306 \r
307                 // Remove last comma\r
308                 $UIDs = str_replace(", ", "\n", substr($UIDs, 0, -2));\r
309 \r
310                 // Send mail notification to admin\r
311                 if ($CONFIG['ap_un_mail'] == "Y")\r
312                 {\r
313                         if (GET_EXT_VERSION("admins") >= "0.4.1")\r
314                         {\r
315                                 SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_UNCONFIRMED_SUBJECT, "admin_autopurge_unconfirmed", $UIDs, "");\r
316                         }\r
317                          else\r
318                         {\r
319                                 $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_unconfirmed", $UIDs, "");\r
320                                 SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_UNCONFIRMED_SUBJECT, $msg);\r
321                         }\r
322                 }\r
323         }\r
324 \r
325         // Free memory\r
326         SQL_FREERESULT($result_uncon);\r
327 }\r
328 \r
329 // Check version (must be > 0.0)\r
330 if ((GET_EXT_VERSION("task") > "0.0") && ($CONFIG['ap_tasks'] == "Y"))\r
331 {\r
332         // Purge deleted tasks (no notification to admin)\r
333         $since = bigintval(time() - $CONFIG['ap_tasks_time']);\r
334         $result = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_task_system WHERE status='DELETED' AND task_created <= %s",\r
335          array($since), __FILE__, __LINE__);\r
336         $DELETED = SQL_AFFECTEDROWS();\r
337 \r
338         if (($DELETED > 0) && ($CONFIG['ap_tasks_mail'] == "Y"))\r
339         {\r
340                 // Send out email to admin\r
341                 if (GET_EXT_VERSION("admins") >= "0.4.1")\r
342                 {\r
343                         SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_TASKS_SUBJECT, "admin_autopurge_tsks", $DELETED, "");\r
344                 }\r
345                  else\r
346                 {\r
347                         $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_tsks", $DELETED, "");\r
348                         SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_TASKS_SUBJECT, $msg);\r
349                 }\r
350         }\r
351 }\r
352 \r
353 // Search for mails from deleted members?\r
354 if ($CONFIG['ap_del_mails'])\r
355 {\r
356         // Okay, let's check for them...\r
357         $since = bigintval(time() - $CONFIG['ap_dm_timeout']);\r
358         $result_mails = SQL_QUERY_ESC("SELECT sender FROM "._MYSQL_PREFIX."_pool WHERE data_type='DELETED' AND timestamp <= %s ORDER BY sender",\r
359          array($since), __FILE__, __LINE__);\r
360 \r
361         // Reset counter...\r
362         $DELETED = 0;\r
363 \r
364         // Do we have "purged" mails?\r
365         if (SQL_NUMROWS($result_mails) > 0)\r
366         {\r
367                 // Okay, check for their sender's\r
368                 while(list($sender) = SQL_FETCHROW($result_mails))\r
369                 {\r
370                         // Check now...\r
371                         $fount = SQL_NUMROWS(SQL_QUERY_ESC("SELECT userid FROM "._MYSQL_PREFIX."_user_data WHERE userid=%d LIMIT 1", array(bigintval($sender)), __FILE__, __LINE__));\r
372                         if ($found == 0)\r
373                         {\r
374                                 // Okay we found some mails!\r
375                                 $result_remove = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_pool WHERE sender=%d",\r
376                                  array(bigintval($sender)), __FILE__, __LINE__);\r
377                                 $DELETED += SQL_AFFECTEDROWS();\r
378 \r
379                                 // Reset query (to prevent possible errors) ...\r
380                                 $since = bigintval(time() - $CONFIG['ap_dm_timeout']);\r
381                                 $result_mails = SQL_QUERY_ESC("SELECT sender FROM "._MYSQL_PREFIX."_pool WHERE data_type='DELETED' AND timestamp <= %s ORDER BY sender",\r
382                                  array($since), __FILE__, __LINE__);\r
383                         }\r
384                 }\r
385         }\r
386 \r
387         // Free memory\r
388         SQL_FREERESULT($result_mails);\r
389 \r
390         // Now let's check for stats entries as well\r
391         $since = bigintval(time() - $CONFIG['ap_dm_timeout']);\r
392         $result_mails = SQL_QUERY_ESC("SELECT sender FROM "._MYSQL_PREFIX."_pool WHERE data_type='DELETED' AND timestamp <= %s ORDER BY sender",\r
393          array($since), __FILE__, __LINE__);\r
394 \r
395         // Do we have "purged" mails?\r
396         if (SQL_NUMROWS($result_mails) > 0)\r
397         {\r
398                 // Okay, check for their sender's\r
399                 while(list($sender) = SQL_FETCHROW($result_mails))\r
400                 {\r
401                         // Check now...\r
402                         $found = SQL_NUMROWS(SQL_QUERY_ESC("SELECT userid FROM "._MYSQL_PREFIX."_user_data WHERE userid=%d LIMIT 1", array(bigintval($sender)), __FILE__, __LINE__));\r
403                         if ($found == 0)\r
404                         {\r
405                                 // Okay we found some mails!\r
406                                 $result_remove = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_user_stats WHERE sender=%d", array(bigintval($sender)), __FILE__, __LINE__);\r
407                                 $DELETED += SQL_AFFECTEDROWS();\r
408 \r
409                                 // Reset query (to prevent possible errors) ...\r
410                                 $since = bigintval(time() - $CONFIG['ap_dm_timeout']);\r
411                                 $result_mails = SQL_QUERY_ESC("SELECT sender FROM "._MYSQL_PREFIX."_user_stats WHERE data_type='DELETED' AND timestamp_send <= %s ORDER BY sender",\r
412                                  array($since), __FILE__, __LINE__);\r
413                         }\r
414                 }\r
415         }\r
416 \r
417         // Free memory\r
418         SQL_FREERESULT($result_mails);\r
419 \r
420         // Do we have deleted mails and the admin want's to receive a notification\r
421         if (($DELETED > 0) && ($CONFIG['ap_dm_notify'] == "Y"))\r
422         {\r
423                 // Send out email to admin\r
424                 if (GET_EXT_VERSION("admins") >= "0.4.1")\r
425                 {\r
426                         SEND_ADMIN_EMAILS_PRO(AUTOPURGE_ADMIN_DEL_MAILS_SUBJECT, "admin_autopurge_del_mails", $DELETED, "");\r
427                 }\r
428                  else\r
429                 {\r
430                         $msg = LOAD_EMAIL_TEMPLATE("admin_autopurge_del_mails", $DELETED, "");\r
431                         SEND_ADMIN_EMAILS(AUTOPURGE_ADMIN_DEL_MAILS_SUBJECT, $msg);\r
432                 }\r
433         }\r
434 }\r
435 \r
436 if (EXT_IS_ACTIVE("rallye"))\r
437 {\r
438         // Check expired rallyes (hard-coded 3 days limit for displaying expired rallyes!)\r
439         require_once(PATH."inc/libs/rallye_functions.php");\r
440         RALLYE_DELETE_EXPIRED_RALLYES();\r
441 }\r
442 //\r
443 if (EXT_IS_ACTIVE("bonus"))\r
444 {\r
445         // Check for expired turbo bonus lines\r
446         require_once(PATH."inc/libs/bonus_functions.php");\r
447         BONUS_PURGE_EXPIRED_TURBO_BONUS();\r
448 }\r
449 //\r
450 ?>\r