Optimización mayor en carga de modulos.
[xmensajitos.php.git] / index.php
blob5fce26a8665a0ac2418ff43849cacb1680130929
1 <?php
2 ob_start("ob_gzhandler");
3 header("Content-Type:text/html; charset=UTF-8");
4 /*
5 *****************************************************************
6 Licencia original:
8 * Mensajitos V2.3.1
9 * Actualizado el 14/10/2006_**
10 * Este programa es propiedad intelectual de
11 * Mario Enrique Gomez Argueta. Su uso y distribucion
12 * esta permitida bajo los terminos de la licencia
13 * GNU/GPL 2.0 o posterior, que puede ser obtenida en
14 * http://www.fsf.org/
16 * Este programa hace uso de la biblioteca Snoopy
17 * distribuida tambien bajo la licencia GNU/GPL.
18 * Para mayor informacion visitar:
19 * http://snoopy.sourceforge.net/
21 *****************************************************************
23 *****************************************************************
24 Esta es la rama experimental NO oficial: "xMensajitos.php".
25 Esta rama experimental es mantenida por Carlos Vladimir Hidalgo Durán.
26 Contacto: vladimiroski@gmail.com
27 Más información: http://xmensajitos.todosv.com
29 $MiVersion = '2.22.0 [PRE]';
30 // Definimos las constantes de directorios para poder accesarlas desde todo el codigo
31 $home = dirname(__FILE__);
32 // Plantilla HTML por defecto.
33 $plantilla = $home."/plantilla/mensajitos.htm";
34 // Nombre de los modulos disponibles
35 $modulos = array('Digicel','Telecom','Red','Telefonica','Tigo');
36 // En data.php se almacenan los datos de acceso al servidor MySQL.
37 // Este archivo es creado vía /instalar.php
38 require_once($home."/datos/data.php");
40 //**************************************************
41 // Si no hay soporte MySQL:
43 // Este archivo guarda los datos para el control de Flood
44 $nMDB = $home."/datos/numeros.db";
45 // Este archivo guarda las estadísticas
46 $cMDB = $home."/datos/cuentas.db";
47 // Este archivo guarda los números fuera de rango
48 $r_fuera_de_rango = $home."/datos/fuera_rango.db";
49 // Cargamos la Clase necesaria para manipular INIs
50 require_once($home."/libs/iniparser.php" );
51 //**************************************************
53 // Cargamos la Clase para comunicarnos con POST/GET facilmente
54 require_once($home."/libs/snoopy.php");
55 // Nuestras funciones para uso de proxys
56 require_once($home."/libs/proxymity.php");
57 /*************************************************************************/
58 // Tratamos de conectarnos a la base de datos, si lo conseguimos entonces
59 // activamos la variable que indicará que se pueden utilizar las funciones
60 // dependientes de MiDB.
61 // Este metodo debería de asegurar que no se pierda funcionalidad principal
62 // al no tener configurado MiBD.
63 /*************************************************************************/
64 $MiBD_link = @mysql_connect($MiBD_IP, $MiBD_usuario, $MiBD_clave, false);
65 if ( !$MiBD_link ) {
66 //No nos pudimos conectar
67 $MiBD_OK = false;
68 } else {
69 //Si nos pudimos conectar, entonces todo depende que podamos escoger sin problemas
70 //la base de datos.
71 $MiBD_OK = @mysql_select_db($MiBD_BD, $MiBD_link);
74 //Ok, si no tenemos MiBD entonces regresamos al viejo y confiable sistema INI.
75 if ( !$MiBD_OK ) {
76 $I_nMDB = new iniParser($nMDB);
77 $I_cMDB = new iniParser($cMDB);
78 } else {
79 //echo 'conectado<br />';
82 /*************************************************************************/
83 // Mensajes
84 /*************************************************************************/
85 //Envio exitoso
86 $mensajeOK = "<b>Mensaje enviado a {uNumero}.<br />De la red de {operador}.</b>";
87 //Envio fallido
88 $mensajeERROR = "<b>Error al enviar el mensaje.<br />Se uso el operador: {operador}.</b>";
89 //No habia Operador válido
90 $mensajeOPEP = "<b>Error al enviar el mensaje.<br />Revise el numero ({uNumero},{operador}).</b>";
91 /*************************************************************************/
93 /*************************************************************************/
94 // Opciones
95 /*************************************************************************/
96 $limite_flood_num = 50; //Numero maximo de mensajes por $intervalo_flood a un numero.
97 $limite_flood_ip = 100; //Numero maximo de mensajes por $intervalo_flood desde 1 ip
98 $intervalo_flood = 3600; //Intervalo de flood (en segundos)
99 $filtro = array(".*(hsbc).*", ".*(credomatic).*", ".*(citibank).*", ".*(banco agr?cola).*", ".*(banco cu?catl?n).*", ".*(mora|moroso) .*", ".*(deud.{1,2}) .*");
100 /*************************************************************************/
102 if(stristr($_SERVER['HTTP_ACCEPT'],"text/vnd.wap.wml")){
103 // Es un dispositivo movil, soporta WML
104 $plantilla = $home."/plantilla/mensajitos.wml";
105 $mime = "text/vnd.wap.wml";
106 header("Content-type: $mime");
108 else{
109 // No soporta wml (o no quiere xD)
110 /*****************************************/
111 //Será que quiere un modo de presentación especial?
112 if ( isset($_GET['visual']) ) {
113 switch ( $_GET['visual'] ) {
114 case "iframe":
115 $plantilla = $home."/plantilla/mensajitos.iframe.htm";
116 break;
117 case "estado":
118 $plantilla = $home."/plantilla/mensajitos.estado.htm";
119 break;
121 } else {
122 $plantilla = $home."/plantilla/mensajitos.htm";
124 $mime = "text/html";
127 if ( $MiBD_OK ) {
128 InsertarValorSQL("xsms_estadisticas", "'$mime','1'", "valor=valor+1");
131 function ObtenerValorSQL($sTabla, $sColumna, $sWhere) {
132 global $MiBD_OK, $MiBD_link;
133 if ( $MiBD_OK ) {
134 $q = "SELECT $sColumna FROM $sTabla WHERE $sWhere;";
135 //echo $q."<br>";
136 $resultado = @mysql_query($q, $MiBD_link);
137 if(mysql_num_rows($resultado) > 0){
138 return mysql_result($resultado,0,$sColumna);
139 } else {
140 return false;
145 function EstablecerValorSQL($sTabla, $sValores) {
146 global $MiBD_OK, $MiBD_link;
147 if ( $MiBD_OK ) {
148 $q = "REPLACE INTO $sTabla VALUES ($sValores);";
149 //echo $q."<br>";
150 $resultado = @mysql_query($q, $MiBD_link);
151 if( $resultado ){
152 return true;
153 } else {
154 return false;
159 function InsertarValorSQL($sTabla, $sValores, $OnUpdate) {
160 global $MiBD_OK, $MiBD_link;
161 if ( $MiBD_OK ) {
162 $q = "INSERT INTO $sTabla VALUES ($sValores) ON DUPLICATE KEY UPDATE $OnUpdate;";
163 //echo $q."<br>";
164 $resultado = @mysql_query($q, $MiBD_link);
165 if( $resultado ){
166 return true;
167 } else {
168 return false;
173 function agregarNumFueraDeRango($Numero){
174 global $MiBD_OK;
175 if ( $MiBD_OK ) {
176 global $MiBD_link;
177 $q = "INSERT IGNORE INTO xsms_fuera_de_rango VALUES ('$Numero');";
178 @mysql_query($q, $MiBD_link);
179 }else {
180 $I_FR_MDB = new iniParser($r_fuera_de_rango);
181 $I_FR_MDB->setValue($Numero, "Hit","SI");
182 $I_FR_MDB->save();
186 function procesarPlantilla($archivo,$valores) {
187 $buffer = file_get_contents($archivo);
188 foreach($valores as $var=>$val) {
189 $buffer = str_replace($var,$val,$buffer);
191 return $buffer;
194 function DenegarFiltro($mensaje) {
195 global $filtro;
196 $denegar = false;
197 foreach($filtro as $var=>$val) {
198 //echo "$var";
199 //echo "$val<br>";
200 if (eregi($val, $mensaje, $textoEncontrado)) {
201 echo "Palabra '$textoEncontrado[1]' (detectada como '$val' !)<br>";
202 $denegar = true;
205 return $denegar;
208 // Detecta el modulo a utilizar en base al numero de telefono
209 function ModuloOperador($pre) {
210 global $modulos;
211 if((($pre>=73000000)&&($pre<=73999999))||
212 (($pre>=73800000)&&($pre<=74399999))||
213 (($pre>=77600000)&&($pre<=77799999))||
214 (($pre>=79700000)&&($pre<=79799999))) {
215 return $modulos[0]; //Digicel
218 if((($pre>=21000000)&&($pre<=21044999))||
219 (($pre>=70000000)&&($pre<=70699999))||
220 (($pre>=70800000)&&($pre<=70999999))||
221 (($pre>=76000000)&&($pre<=76699999))||
222 (($pre>=77400000)&&($pre<=77599999))||
223 (($pre>=78050000)&&($pre<=78099999))||
224 (($pre>=78400000)&&($pre<=78699999))||
225 (($pre>=79500000)&&($pre<=79699999))||
226 (($pre>=79850000)&&($pre<=79899999))) {
227 return $modulos[1]; //Telecom
230 if(($pre>=79800000)&&($pre<=79839999)) {
231 return $modulos[2]; //Red
234 if((($pre>=71000000)&&($pre<=71999999))||
235 (($pre>=77000000)&&($pre<=77199999))||
236 (($pre>=77800000)&&($pre<=77849999))||
237 (($pre>=77900000)&&($pre<=77949999))||
238 (($pre>=78100000)&&($pre<=78399999))||
239 (($pre>=78450000)&&($pre<=78499999))||
240 (($pre>=79900000)&&($pre<=79989999))||
241 (($pre>=79990000)&&($pre<=79999999))) {
242 return $modulos[3]; //Telefonica
245 if((($pre>=72000000)&&($pre<=72999999))||
246 (($pre>=75000000)&&($pre<=75999999))||
247 (($pre>=76000000)&&($pre<=76099999))||
248 (($pre>=77200000)&&($pre<=77399999))||
249 (($pre>=77850000)&&($pre<=77899999))||
250 (($pre>=77950000)&&($pre<=77999999))||
251 (($pre>=78700000)&&($pre<=78749999))||
252 (($pre>=78800000)&&($pre<=78999999))||
253 (($pre>=78750000)&&($pre<=78799999))||
254 (($pre>=79000000)&&($pre<=79499999))) {
255 return $modulos[4]; //Tigo
257 agregarNumFueraDeRango(substr($pre,0,4));
258 return NULL;
261 //Sera que quieren hacer un GET?
262 if(isset($_GET['t'])&&isset($_GET['m'])&&isset($_GET['f'])) {
263 $_POST['telefono'] = $_GET['t'];
264 $_POST['mensaje'] = $_GET['m'];
265 $_POST['firma'] = $_GET['f'];
266 } else if(isset($_GET['o'])) {
267 $modulB = ($modulB = ModuloOperador($_GET['o'])) ? $modulB : '?';
268 exit ($modulB);
271 // Evaluamos el formulario basico
272 if(isset($_POST['telefono'])&&isset($_POST['mensaje'])&&isset($_POST['firma'])) {
273 // Verificamos que no se haya establecido nada en vars
274 if(isset($vars))
275 unset($vars);
276 // Guardamos las variables:
277 $telefono = $_POST['telefono'];
278 $mensaje = $_POST['mensaje'];
279 $firma = $_POST['firma'];
280 //************************************************
281 // Revisión de respuesta (Si se envío o no)
282 //$url_ok = $_POST['urlok'];
283 //$url_bad = $_POST['urlbad'];
284 //************************************************
285 //Comprobamos que no sea publicidad, cobro, etc.
286 if (DenegarFiltro($mensaje))
287 exit ("Lo sentimos, publicidad y cobros no son aceptados. <br>Aprenda mas sobre esto aqui:<br>" .' <A href="http://foro.todosv.com/index.php/topic,95">Filtros... en pro de los salvadoreños y en contra de las compañías tacañas.<A />');
288 //Validamos el numero telefonico
289 if ($telefono==""||!ereg("^((2|7)[0-9]{7})$", $telefono)) {
290 $estado = "Escriba el numero correctamente";
291 $ret = "Revise su numero";
292 } else {
293 if ( $MiBD_OK ) {
294 $cuentaNum = ObtenerValorSQL("xsms_flood","valor","clave='$telefono.cuenta'");
295 $ultimoNum = ObtenerValorSQL("xsms_flood","valor","clave='$telefono.ultimo'");
296 $cuentaIP = ObtenerValorSQL("xsms_flood","valor","clave='".$_SERVER['REMOTE_ADDR'].".cuenta'");
297 $ultimoIP = ObtenerValorSQL("xsms_flood","valor","clave='".$_SERVER['REMOTE_ADDR'].".ultimo'");
298 } else {
299 //Comprobamos que no tenga ban.
300 //Cuenta de mensajes a ese numero
301 $cuentaNum = $I_nMDB->getValue($telefono, "cuenta");
302 //Cuando se envio por ultima vez un mensaje a ese numero
303 $ultimoNum = $I_nMDB->getValue($telefono, "ultimo");
304 //Cuenta de mensajes desde esa IP
305 $cuentaIP = $I_nMDB->getValue($_SERVER['REMOTE_ADDR'], "cuenta");
306 //Cuando esa IP nos envio por ultima vez un mensaje
307 $ultimoIP = $I_nMDB->getValue($_SERVER['REMOTE_ADDR'], "ultimo");
309 //-------------------------------------------------
310 $flooder = 0;
311 if (((time() - $ultimoIP) < $intervalo_flood)&&($cuentaIP>$limite_flood_ip)) {
312 //Si no ha pasado una hora desde su ultimo mensaje y ha enviado mas mensajes de la cuenta (IP)
313 $estado = "Demasiados mensajes por hora desde tu maquina.";
314 $ret = "Por favor espere 1 hora. [FLOOD]";
315 if ( $MiBD_OK ) {
316 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".ultimo', '". time() . "'");
317 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".flood', '1'");
318 } else {
319 $I_nMDB->setValue( $_SERVER['REMOTE_ADDR'], "ultimo", time());
320 $I_nMDB->setValue( $_SERVER['REMOTE_ADDR'], "flood", 1);
322 $flooder = 1;
323 } else if (((time() - $ultimoNum) < $intervalo_flood)&&($cuentaNum>$limite_flood_num)) {
324 //Si no ha pasado una hora desde su ultimo mensaje y ha enviado mas mensajes de la cuenta (Numero)
325 $estado = "Demasiados mensajes por hora a este numero.";
326 $ret = "Por favor espere 1 hora para enviar a este numero. [FLOOD]";
327 if ( $MiBD_OK ) {
328 EstablecerValorSQL("xsms_flood","'$telefono.flood', '1'");
329 } else {
330 $I_nMDB->setValue( $telefono, "flood", 1);
332 $flooder = 1;
334 if ((time() - $ultimoIP) > $intervalo_flood) {
335 //Si ha pasado una hora desde su ultimo mensaje (IP) le reseteamos su conteo (IP)
336 $cuentaIP = 0;
337 if ( $MiBD_OK ) {
338 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".flood', '0'");
339 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".cuenta, '0'");
340 } else {
341 $I_nMDB->setValue($_SERVER['REMOTE_ADDR'], "flood", 0);
342 $I_nMDB->setValue($_SERVER['REMOTE_ADDR'], "cuenta", 0);
345 if ((time() - $ultimoNum) > $intervalo_flood) {
346 //Si ha pasado una hora desde su ultimo mensaje (Num) le reseteamos su conteo (Num)
347 $cuentaNum = 0;
348 if ( $MiBD_OK ) {
349 EstablecerValorSQL("xsms_flood", "'$telefono.flood', '0'");
350 EstablecerValorSQL("xsms_flood","'$telefono.cuenta', '0'");
351 } else {
352 $I_nMDB->setValue($telefono, "flood", 0);
353 $I_nMDB->setValue($telefono, "cuenta", 0);
356 if ($flooder == 0) {
357 //Ok, no tiene banneo por flood.
358 //Ok, el numero es valido, pero ha escrito un mensaje a enviar?.
359 if ($mensaje){
360 // Si, ha escrito un mensaje ahora buscar un operador para el numero.
361 $modulo = ModuloOperador($telefono);
362 if($modulo) {
363 require_once($home."/modulos/".$modulo.".php");
364 $nombreMod = $modulo."_Nombre";
365 $ret = $nombreMod();
366 $FEnvio = $modulo."_Enviar";
367 if($FEnvio($telefono,$mensaje,$firma)) {
368 $estado = $mensajeOK;
369 //Control de Flood
370 if ( $MiBD_OK ) {
371 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".cuenta', '" . ($cuentaIP+=1) ."'");
372 EstablecerValorSQL("xsms_flood","'".$_SERVER['REMOTE_ADDR'].".ultimo', '". time() ."'");
373 EstablecerValorSQL("xsms_flood","'$telefono.cuenta', '". ($cuentaNum+=1) ."'");
374 EstablecerValorSQL("xsms_flood","'$telefono.ultimo', '". time() ."'");
375 } else {
376 $I_nMDB->setValue($_SERVER['REMOTE_ADDR'], "cuenta", $cuentaIP += 1);
377 $I_nMDB->setValue($_SERVER['REMOTE_ADDR'], "ultimo", time());
378 $I_nMDB->setValue($telefono, "cuenta", $cuentaNum += 1) ;
379 $I_nMDB->setValue($telefono, "ultimo", time());
381 //Control de Flood
382 $mensaje = '';
383 //+1 al modulo OK
384 if ( $MiBD_OK ) {
385 InsertarValorSQL("xsms_estadisticas", "'".$modulo."-OK". "','1'", "valor=valor+1");
386 }else {
387 $cuenta = $I_cMDB->getValue("Companias", $modulo."-OK");
388 $I_cMDB->setValue( "Companias", $modulo."-OK",$cuenta += 1);
390 } else {
391 $estado = $mensajeERROR;
392 //+1 al modulo ERROR
393 if ( $MiBD_OK ) {
394 InsertarValorSQL("xsms_estadisticas", "'".$modulo."-ERR". "','1'", "valor=valor+1");
395 }else {
396 $cuenta = $I_cMDB->getValue("Companias", $modulo."-ERR");
397 $I_cMDB->setValue( "Companias", $modulo."-ERR",$cuenta += 1);
400 } else {
401 $ret = "Sin Operador";
402 $estado = $mensajeOPEP;
404 } else {
405 $estado = "Olvido escribir su mensaje";
406 $ret = "Revise su mensaje";
409 if ( $MiBD_OK ) {
410 }else {
411 $I_cMDB->save();
412 $I_nMDB->save();
416 //Accion del POST
417 if(isset($_SERVER['REQUEST_URI']))
418 $vars["{script}"] = $_SERVER['REQUEST_URI'];
419 else
420 $vars["{script}"] = $_SERVER['PHP_SELF'];
421 //Accion del POST
423 //Informacion del formulario
424 $vars["{version}"] = '<a href="http://www.todosv.com" target="_blank">Version ' . $MiVersion . '</a><br /><a href="estad.php" target="_blank">Estadísticas</a>';
425 $vars["{estado}"] = $estado;
426 $vars["{operador}"] = $ret;
427 $vars["{uNumero}"] = $telefono;
428 $vars["{uMensaje}"] = $mensaje;
429 $vars["{uFirma}"] = $firma;
431 // Sustituimos los valores en la plantilla:
432 echo procesarPlantilla($plantilla,$vars);