00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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
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
00076 miServer->Escribe (it.value().descriptor, mensaje);
00077 return;
00078 }
00079 }
00080
00081
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 {
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
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 {
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
00147 miServer->Escribe (desc, MENSAJE_CONEXION);
00148 miServer->Escribe (desc, "\n\nNombre de usuario: ");
00149 }