Página principal | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

Mensajero.cpp

Ir a la documentación de este archivo.
00001 
00006 /*
00007    MUnDoCAAD MUD Engine
00008    Copyright (C) 2002-2005 José Manuel Ferrer Ortiz
00009 
00010    *****************************************************************************
00011    *                                                                           *
00012    *  This program is free software; you can redistribute it and/or modify it  *
00013    *  under the terms of the GNU General Public License version 2, as          *
00014    *  published by the Free Software Foundation.                               *
00015    *                                                                           *
00016    *  This program is distributed in the hope that it will be useful, but      *
00017    *  WITHOUT ANY WARRANTY; without even the implied warranty of               *
00018    *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU         *
00019    *  General Public License version 2 for more details.                       *
00020    *                                                                           *
00021    *  You should have received a copy of the GNU General Public License        *
00022    *  version 2 along with this program; if not, write to the Free Software    *
00023    *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  *
00024    *                                                                           *
00025    *****************************************************************************
00026 */
00027 
00028 
00029 #include "config.hpp"
00030 #include "Ejecutor.hpp"
00031 #include "Guardian.hpp"
00032 #include "Log.hpp"
00033 #include "Mensajero.hpp"
00034 #include "Servidor.hpp"
00035 
00036 
00037 extern Ejecutor *miEjecut;
00038 extern Guardian *miGuard;
00039 extern Servidor *miServer;
00040 
00041 
00043 Mensajero::Mensajero ()
00044 {
00045 }
00046 
00048 Mensajero::~Mensajero ()
00049 {
00050   qDebug ("Destructor de Mensajero");
00051 }
00052 
00054 void Mensajero::EliminaCanal (const int desc)
00055 {
00056   Canal origen = canales.value (desc);
00057 
00058   miEjecut->Ejecuta ("JugadorDesconectado(\"" + origen.nom_personaje + "\")");
00059   canales.remove (desc);
00060 }
00061 
00063 void Mensajero::EnviaMensaje (const QString &receptor, const QString &mensaje)
00064 {
00065   QHashIterator<int, Canal> it (canales);
00066 
00067   // Buscamos el nombre del personaje sin distinguir mayúsculas de minúsculas
00068   while (it.hasNext())
00069   {
00070     it.next();
00071 
00072     if ((it.value().nom_personaje.length() == receptor.length()) &&
00073         (it.value().nom_personaje.startsWith (receptor, Qt::CaseInsensitive)))
00074     {
00075       // Coincidencia
00076       miServer->Escribe (it.value().descriptor, mensaje);
00077       return;
00078     }
00079   }
00080 
00081   // No hay ningún jugador con ese nombre conectado al MUD
00082   qWarning ("Se ha intentado enviar un mensaje a un jugador no presente (%s)",
00083             receptor.toLatin1().constData());
00084 }
00085 
00087 void Mensajero::NuevaLinea (const int desc, const QString &linea)
00088 {
00089   if (!canales.contains (desc))
00090     qFatal ("Intento de lectura desde un descriptor no presente.");
00091 
00092   Canal origen = canales.value (desc);
00093 
00094   switch (origen.estado)
00095   {
00096     case ESTADO_USUARIO:
00097       origen.nom_usuario = linea;
00098       origen.estado      = ESTADO_CLAVE;
00099       canales.insert (desc, origen);
00100       miServer->Escribe (desc, "Contraseña: ");
00101       break;
00102     case ESTADO_CLAVE:
00103       if (miGuard->Autentifica (origen.nom_usuario, linea))
00104       {  // Clave correcta
00105         origen.estado = ESTADO_PERSONAJE;
00106         miServer->Escribe (desc, "Personaje: ");
00107       }
00108       else
00109       {
00110         Log (6, "Intento de autentificación fallido.\n");
00111         origen.num_fallos += 1;
00112         if (origen.num_fallos >= MAX_FALLOS)
00113           // El Servidor llamará a EliminaCanal
00114           miServer->CierraConexion (desc);
00115         else
00116         {
00117           origen.estado = ESTADO_USUARIO;
00118           miServer->Escribe (desc, "\n\nNombre de usuario: ");
00119         }
00120       }
00121       canales.insert (desc, origen);
00122       break;
00123     case ESTADO_PERSONAJE:
00124       if (miGuard->ValidaPersonaje (origen.nom_usuario, linea))
00125       {  // El usuario puede dirigir a este personaje
00126         origen.nom_personaje = linea;
00127         origen.estado        = ESTADO_DENTRO;
00128         canales.insert (desc, origen);
00129         miServer->Escribe (desc, MENSAJE_BIENVENIDA);
00130         miEjecut->Ejecuta ("JugadorConectado(\"" + origen.nom_usuario + "\")");
00131       }
00132       else
00133         miServer->Escribe (desc, "Personaje: ");
00134   }
00135 }
00136 
00138 void Mensajero::NuevoCanal (const int desc)
00139 {
00140   Canal canal;
00141   canal.descriptor = desc;
00142   canal.estado     = ESTADO_USUARIO;
00143   canal.num_fallos = 0;
00144   canales.insert (desc, canal);
00145 
00146   // Mostramos el mensaje de conexión y pedimos el nombre de usuario
00147   miServer->Escribe (desc, MENSAJE_CONEXION);
00148   miServer->Escribe (desc, "\n\nNombre de usuario: ");
00149 }

Generado el Tue Nov 29 01:04:33 2005 para MUnDoCAAD MUD Engine por  doxygen 1.4.4