Php, Bot irc – Sistema !seen

Autor: Iván Alexis - Fecha: Jueves 23 de Julio del 2009 - 1 Comentario

¿Que es php?

Php, es un lenguaje de programacion orientado a la creación de sitios webs dinámicos.

¿Que es un bot irc?

Un bot irc es un usuario que se conecta a un servidor de chat irc cualquiera e interactua con otros osuarios por medio de comandos y/o eventos.

¿Que es el sistema "seen"?

El sistema seen es uno de los sistemas orientados a bot's irc mas complejo que existe, consiste en mostrar información de un nick cualquiera consultado, con esto el usuario que consulta sabra con detalles si el nick consultado fue expulsado de un canal, o salio, considerando los cambios de nick, esta informacion es juntada y mostrada al usuario que la consulta.

Una muestra del sistema en funcionamiento:sistema-seen-php-bot-irc

A continuación les muestro el lenguaje escrito en php que ocupe para este resultado:

PLAIN TEXT
PHP:
  1. // Variables General.
  2.  
  3. $primera_linea=TRUE;
  4. $id_ajoin="0";
  5.  
  6. // Lista de Ajoin
  7.  
  8. $ajoin[0]="#bot";
  9.  
  10. // Variables de conexion al servidor IRC
  11.  
  12. $irc_servidor="ircchat.terra.cl";
  13. $irc_puerto="7000";
  14. $irc_nick="seen";
  15. $irc_clave="clave_de_bot";
  16. $irc_ident="scripts";
  17. $irc_realname="Bot seen";
  18.  
  19. // Nos conectamos al servidor IRC
  20.  
  21. $servidor_irc=fsockopen($irc_servidor,$irc_puerto,$errno,$errstr,30);
  22.  
  23. // Comprobamos conexion
  24.  
  25. if (!$servidor_irc) {
  26. echo "$errstr ($errno)".$salto;
  27. return 0;
  28. }
  29. // Entramos al servidor
  30.  
  31. comando($servidor_irc,"nick ".$irc_nick.$salto);
  32. comando($servidor_irc,"user ".$irc_ident." text text :".$irc_realname.$salto);
  33.  
  34. // Leemos respuesta del servidor
  35.  
  36. while(!feof($servidor_irc)) {
  37.  
  38. $buffer=fgets($servidor_irc,4096);
  39. $_buffer=explode(" ",$buffer);
  40.  
  41. // Entrada solo en minusculas para hacer comparaciones
  42.  
  43. $buffer_min=strtolower($buffer);
  44. $_buffer_min=explode(" ",$buffer_min);
  45.  
  46. // Ejecución de comandos que se ejecutan solo una vez
  47.  
  48. if ($primera_linea) {
  49. comando($servidor_irc,"PRIVMSG NickServ :identify ".$irc_clave.$salto);
  50. comando($servidor_irc,"MODE ".$irc_nick." +R".$salto);
  51.  
  52. // Entramos a los canales
  53. $c=0;
  54. while ($ajoin[$c]) {
  55. comando($servidor_irc,"JOIN ".$ajoin[$c].$salto);
  56. $c=$c+1;
  57. }
  58.  
  59. $primera_linea=FALSE;
  60. }
  61.  
  62. // Respuesta de PING.
  63.  
  64. if ("PING" == $_buffer[0]) {
  65. comando($servidor_irc,'PONG '.str_replace(':','',$_buffer[1]).$salto);
  66. }
  67.  
  68. // Al salir de un canal
  69.  
  70. if ("PART" == $_buffer[1]) {
  71. $nick=nick($_buffer_min[0]);
  72. $nick=rtrim($nick);
  73. $seen[$nick]=TRUE;
  74. $tiempo[$nick]=time();
  75. $evento[$nick]="part";
  76. $canales_nick[$nick]=$canales_nick[$nick]-1;
  77. if ($canales_nick[$nick]<=0) {
  78. $online[$nick]=FALSE;
  79. $ultimo_canal[$nick]=str_replace('#','',rtrim($_buffer_min[2]));
  80. if ($_buffer[3]) {
  81. $ultimo_mensaje[$nick]=texto($_buffer[0].$_buffer[1].$_buffer[2],$buffer);
  82. }
  83. else {
  84. $ultimo_mensaje[$nick]=FALSE;
  85. }
  86. }
  87. else {
  88. $evento[$nick]="join";
  89. }
  90. }
  91.  
  92. // Al salir del servidor
  93.  
  94. if ("QUIT" == $_buffer[1]) {
  95. $nick=nick($_buffer_min[0]);
  96. $nick=rtrim($nick);
  97. $seen[$nick]=TRUE;
  98. $tiempo[$nick]=time();
  99. $evento[$nick]="quit";
  100. $online[$nick]=FALSE;
  101. $ultimo_mensaje[$nick]=texto_q($_buffer[0].$_buffer[1],$buffer);
  102. }
  103.  
  104. // Al entrar a un canal
  105.  
  106. if ("JOIN" == $_buffer[1]) {
  107. $nick=nick($_buffer_min[0]);
  108. $nick=rtrim($nick);
  109. $seen[$nick]=TRUE;
  110. $evento[$nick]="join";
  111. $online[$nick]=TRUE;
  112. $host[$nick]=host($_buffer[0]);
  113. if (!$canales_nick[$nick]) {
  114. $canales_nick[$nick]=1;
  115. }
  116. else {
  117. $canales_nick[$nick]=$canales_nick[$nick]+1;
  118. }
  119. }
  120.  
  121. // Al ser expulsado de un canal
  122.  
  123. if ("KICK" == $_buffer[1]) {
  124. $nick=rtrim(str_replace(':','',$_buffer_min[3]));
  125. $seen[$nick]=TRUE;
  126. $tiempo[$nick]=time();
  127. $evento[$nick]="kick";
  128. $canales_nick[$nick]=$canales_nick[$nick]-1;
  129. if ($canales_nick[$nick]<=0) {
  130. $online[$nick]=FALSE;
  131. $ultimo_canal[$nick]=str_replace('#','',$_buffer_min[2]);
  132. if ($_buffer[3]) {
  133. $ultimo_mensaje[$nick]=texto_k($_buffer[0].$_buffer[1].$_buffer[2].$_buffer[3],$buffer);
  134. }
  135. else {
  136. $ultimo_mensaje[$nick]=FALSE;
  137. }
  138. }
  139. else {
  140. $evento[$nick]="join";
  141. }
  142. }
  143.  
  144. // Al cambiarse el nick
  145.  
  146. if ("NICK" == $_buffer[1]) {
  147. $nick=nick($_buffer_min[0]);
  148. $nick=rtrim($nick);
  149. $seen[$nick]=TRUE;
  150. $evento[$nick]="nick";
  151. $nick_n=rtrim(str_replace(':','',$_buffer_min[2]));
  152. $nick_siguiente_real[$nick]=str_replace(':','',$_buffer[2]);
  153. $nick_siguiente[$nick]=$nick_n;
  154. $evento[$nick_n]="join";
  155. $seen[$nick_n]=TRUE;
  156. $canales_nick[$nick_n]=$canales_nick[$nick];
  157. $canales_nick[$nick]=0;
  158. }
  159.  
  160. // Actualizacion de lista de nicks en el canal
  161.  
  162. if ("353" == $_buffer[1]) {
  163. $lista_nicks=texto_raw($_buffer[0].$_buffer[1].$_buffer[2].$_buffer[3].$_buffer[4],$buffer_min);
  164. $lista_nicks=str_replace('@','',rtrim($lista_nicks));
  165. $lista_nicks=str_replace('+','',$lista_nicks);
  166. $lista_nicks=str_replace('&','',$lista_nicks);
  167. $lista_nicks=str_replace('%','',$lista_nicks);
  168. $lista=explode(" ",$lista_nicks);
  169. $c=0;
  170. while ($lista[$c]) {
  171. $nick=$lista[$c];
  172. if ($canales_nick[$nick]) {
  173. $canales_nick[$nick]=$canales_nick[$nick]+1;
  174. }
  175. else {
  176. $evento[$nick]="join";
  177. $seen[$nick]=TRUE;
  178. $canales_nick[$nick]=1;
  179. }
  180. $c=$c+1;
  181. }
  182. }
  183.  
  184. // Peticion en el canal
  185.  
  186. if ((stristr($_buffer[2],"#"))&&($_buffer[1]=="PRIVMSG")) {
  187.  
  188. $nick_real=nick($_buffer[0]);
  189. $nick=nick($_buffer_min[0]);
  190. $canal=$_buffer[2];
  191.  
  192. if ($_buffer[3]==":!q") {
  193. comando($servidor_irc,"QUIT :D esconectado.".$salto);
  194. }
  195.  
  196. if ($_buffer[3]==":!seen") {
  197. $a_buscar=rtrim($_buffer_min[4]);
  198. $a_buscar_real=rtrim($_buffer[4]);
  199. if ($seen[$a_buscar]) {
  200. $mensaje="";
  201. $cabecera=TRUE;
  202. while (TRUE) {
  203. if ($evento[$a_buscar]=="join") {
  204. $mensaje=$mensaje.$a_buscar_real." esta actualmente en linea.";
  205. break;
  206. }
  207. if ($evento[$a_buscar]=="kick") {
  208. $mensaje=$mensaje."Se vio por ultima vez hace ".calcular(time()-$tiempo[$a_buscar])." fue expulsado del canal ".$ultimo_canal[$a_buscar];
  209. if ($ultimo_mensaje[$a_buscar]) {
  210. $mensaje=$mensaje." con el motivo: ".$ultimo_mensaje[$a_buscar];
  211. }
  212. break;
  213. }
  214. if ($evento[$a_buscar]=="part") {
  215. $mensaje=$mensaje."Se vio por ultima vez hace ".calcular(time()-$tiempo[$a_buscar])." saliendo del canal ".$ultimo_canal[$a_buscar];
  216. if ($ultimo_mensaje[$a_buscar]) {
  217. $mensaje=$mensaje." dejo el mensaje: ".$ultimo_mensaje[$a_buscar];
  218. }
  219. break;
  220. }
  221. if ($evento[$a_buscar]=="quit") {
  222. $mensaje=$mensaje."Se vio por ultima vez hace ".calcular(time()-$tiempo[$a_buscar]);
  223. if ($ultimo_mensaje[$a_buscar]) {
  224. $mensaje=$mensaje." dejo el mensaje: ".$ultimo_mensaje[$a_buscar];
  225. }
  226. break;
  227. }
  228. if ($evento[$a_buscar]=="nick") {
  229. $tmp="despues a ".rtrim($nick_siguiente_real[$a_buscar]);
  230. if ($cabecera) {
  231. $tmp="Se cambió el nick a ".rtrim($nick_siguiente_real[$a_buscar]);
  232. $cabecera=FALSE;
  233. }
  234. $mensaje=$mensaje.$tmp." ,";
  235. $a_buscar_real=rtrim($nick_siguiente_real[$a_buscar]);
  236. $a_buscar=$nick_siguiente[$a_buscar];
  237. }
  238. }
  239. }
  240. else {
  241. $mensaje="No se ha visto a ".rtrim($_buffer[4]);
  242. }
  243. comando($servidor_irc,"NOTICE ".$nick_real." :".$mensaje.$salto);
  244. }
  245. }
  246. }
  247.  
  248. // Funciones
  249.  
  250. function calcular($c) {
  251. $horas=0;
  252. $minutos=0;
  253. $segundos=0;
  254. while (TRUE) {
  255. if ($c<60) {             $segundos=$c;       break;       }   if ($c>=3600) {
  256. $horas=$horas+1;
  257. $c=$c-3600;
  258. }
  259. else {
  260. $minutos=$minutos+1;
  261. $c=$c-60;
  262. }
  263. }
  264. $mensaje="";
  265. if ($horas>=1) {
  266. if ($horas==1) {
  267. $mensaje="1 hora ";
  268. }
  269. else {
  270. $mensaje=$horas." horas ";
  271. }
  272. }
  273. if ($minutos>=1) {
  274. if ($minutos==1) {
  275. $mensaje=$mensaje."1 minuto ";
  276. }
  277. else {
  278. $mensaje=$mensaje.$minutos." minutos ";
  279. }
  280. }
  281. if ($segundos>=1) {
  282. if ($segundos==1) {
  283. $mensaje=$mensaje."1 segundo";
  284. }
  285. else {
  286. $mensaje=$mensaje.$segundos." segundos";
  287. }
  288. }
  289. return rtrim($mensaje);
  290. }
  291.  
  292. function comando($servidor_irc,$cmd) {
  293. fwrite($servidor_irc,$cmd);
  294. }
  295.  
  296. function nick($nick) {
  297. $txt1="!";
  298. $pos1 = strpos($nick, $txt1);
  299. $pos1=$pos1-1;
  300. return substr($nick, 1,$pos1 );
  301. }
  302.  
  303. function host($c) {
  304. $tmp_array=explode("@",$c);
  305. return $tmp_array[1];
  306. }
  307.  
  308. function texto($t,$buffer) {
  309. $n=strlen($t);
  310. $n=$n+4;
  311. return rtrim(substr($buffer,$n));
  312. }
  313.  
  314. function texto_k($t,$buffer) {
  315. $n=strlen($t);
  316. $n=$n+6;
  317. return rtrim(substr($buffer,$n));
  318. }
  319.  
  320. function texto_raw($t,$buffer) {
  321. $n=strlen($t);
  322. $n=$n+6;
  323. return rtrim(substr($buffer,$n));
  324. }
  325.  
  326. function texto_q($t,$buffer) {
  327. $n=strlen($t);
  328. $n=$n+3;
  329. return rtrim(substr($buffer,$n));
  330. }
  331.  
  332. ?>

Y eso seria todo.

Si te gustó esta publicación, la puedes Compartir y Guardar en tu sitio favorito.

Categorías: General, Scripts • Etiquetas: , , , Volver al principio

1 Comentario en “Php, Bot irc – Sistema !seen”

Iván Alexis CHILE Linux Mozilla 1.9.1.1 // Jueves 23 de Julio del 2009

Recien me di cuenta que hay un error al mostrar el mensaje cuando se le hace un kick, pero es solo de un caracter arregarlo es super sencillo hasta para quien sepa lo minimo :)



Escribe un comentario:


*
A continuacion, debe escribir el codigo mostrado en la imagen.
Anti-Spam Image