protected void Page_Load(object sender, EventArgs e) { string actn = Request["actn"]; //verifico lista global de arboles if (Application["aplicacion"] == null) { Application.Lock(); Application["aplicacion"] = new Aplicacion(Server, Request); Application.UnLock(); } app = (Aplicacion)Application["aplicacion"]; Tools.startupPath = Server.MapPath(""); try { //limpio flores caducadas periodicamente verifyFloresCaducadas(); //proceso peticiones Grupo grupo; Arbol a; string ret = ""; string msg; if (actn != null) { switch (actn.ToLower()) { case "docomentar": //devuelvo las propuestas de toda la rama Response.Write(doComentar(int.Parse(Request["id"]), Request["grupo"], Request["email"], Request["comentario"])); app.addLog("doComentar", Request.UserHostAddress, Request["grupo"], "", Request["comentario"]); break; //case "getpropuestasresaltadas": // //devuelvo las propuestas de toda la rama // Response.Write(getPropuestasResaltadas(int.Parse(Request["id"]), Request["grupo"])); // break; //case "getpropuestas": // //devuelvo las propuestas de toda la rama // Response.Write(getPropuestas(int.Parse(Request["id"]), Request["grupo"])); // break; case "htmldocumento": //devuelvo las propuestas de toda la rama Response.Write(HTMLDocumento(int.Parse(Request["id"]), Request["modelo"], Request["grupo"], Request["email"], int.Parse(Request["width"]))); break; case "htmlpropuesta": //devuelvo las propuestas de toda la rama Response.Write(HTMLPropuesta(int.Parse(Request["id"]), Request["grupo"], Request["email"], int.Parse(Request["width"]))); break; case "getarbolpersonal": grupo = app.getGrupo(Request["grupo"]); lock (grupo) { //devuelvo el arbolPersonal grupo.ts = DateTime.Now; ret = Tools.toJson(grupo.arbol.getArbolPersonal(Request["email"])); } Response.Write(ret); break; case "variante": Response.Write(doVariante(int.Parse(Request["id"]), Request["grupo"], Request["email"], int.Parse(Request["width"]))); break; case "prevista": Response.Write(doPrevista(int.Parse(Request["id"]), Request["modelo"], Request["grupo"], Request["email"], int.Parse(Request["width"]), Request)); break; case "revisar": Response.Write(doRevisar(int.Parse(Request["id"]), Request["modelo"], Request["grupo"], Request["email"], int.Parse(Request["width"]))); break; case "proponer": Response.Write(doProponer(int.Parse(Request["id"]), Request["modelo"], Request["grupo"], Request["email"])); app.addLog("proponer", Request.UserHostAddress, Request["grupo"], Request["email"], "Nueva propuesta recibida"); break; case "seguimiento": Response.Write(doSeguimiento(int.Parse(Request["docID"]), Request["grupo"], int.Parse(Request["width"]))); break; case "toggleflor": Response.Write(doToggleFlor(Request["email"], int.Parse(Request["id"]), float.Parse(Request["x"]), Request["grupo"])); app.addLog("toggleFlor", Request.UserHostAddress, Request["grupo"], Request["email"], "Cambio de voto"); break; case "updatearbol": a = updateArbol(Request["grupo"], int.Parse(Request["cantidadFlores"]), float.Parse(Request["minSiPc"]), float.Parse(Request["maxNoPc"])); Response.Write("Arbol actualizado"); break; //case "download": // Response.ContentType = "application/force-download"; // grupo = app.getGrupo(Request["grupo"]); // a = grupo.arbol; // lock (a) // { // Nodo n = a.getNodo(int.Parse(Request["id"])); // Response.AddHeader("Content-Disposition", "Attachment;filename=" + a.nombre + "_" + n.nombre + ".txt"); // } // Response.Write(download(int.Parse(Request["id"]), Request["grupo"])); // app.addLog("download", Request.UserHostAddress, Request["grupo"], "", "nodo=" + Request["id"]); // break; case "simulacionlive": string separador = (0.0f).ToString("0.0").Substring(1,1); float coopProb = float.Parse(Request["coopProb"].Replace(".",separador)); string x = Request["x"]; //guardo las coordenadas x if (x != "") { grupo = app.getGrupo(Request["grupo"]); lock (grupo) { a = grupo.arbol; foreach (string s in x.Split(',')) { Nodo n = a.getNodo(int.Parse(s.Split('=')[0])); n.x = float.Parse(s.Split('=')[1]); } } } //live bool consensoAlcanzado = false; grupo = app.getGrupo(Request["grupo"]); lock (grupo) { for (int pasos = 0; pasos < 10 && !consensoAlcanzado; pasos++) consensoAlcanzado = consensoAlcanzado || doSimulacionLive(grupo, coopProb); } Response.Write("{\"stop\": " + (consensoAlcanzado ? "true" : "false") + ", \"arbolPersonal\":" + Tools.toJson(grupo.arbol.getArbolPersonal("Prueba")) + "}"); break; case "crearsimulacion": Grupo g = new Grupo(); g.nombre = getSimName(); g.path = Server.MapPath("grupos/" + g.nombre); g.URL = Request.UrlReferrer.AbsoluteUri.Substring(0, Request.UrlReferrer.AbsoluteUri.LastIndexOf("/")); g.objetivo = "simulacion"; a = new Arbol(); a.nombre = g.nombre; a.simulacion = true; a.raiz = new Nodo(); a.raiz.nombre = "Sim"; a.grupo = g; g.arbol = a; lock (app.grupos) { app.grupos.Add(g); } a.minSiPc = 60; a.maxNoPc = 50; //usuario de prueba Usuario u1 = new Usuario(); u1.nombre = "Prueba"; u1.email = "Prueba"; g.usuarios.Add(u1); a.lastSimUsuario = u1; //escribo respuesta List<Type> tipos = new List<Type>(); foreach (Modelo m in Modelo.getModelos()) { tipos.Add(m.GetType()); } Response.Write("{\"arbolPersonal\": " + Tools.toJson(a.getArbolPersonal("Prueba")) + ",\"modelos\":" + Tools.toJson(a.modelos, tipos) + "}"); app.addLog("crearSimulacion", Request.UserHostAddress, "", "", "Simulacion creada"); break; default: throw new appException("Peticion no reconocida"); } } else throw new appException("Peticion no reconocida"); } catch (appException ex) { Response.Write("Error=" + ex.Message); } catch (Exception ex) { string s = "Actn:" + actn.ToLower() + "<br>"; s += "Message:" + ex.Message + "<br>"; s += "REMOTE_ADDR:" + Request.ServerVariables["REMOTE_ADDR"] + "<br>"; s += "Querystring:" + Request.QueryString.ToString() + "<br>"; s += "Form:" + Request.Form.ToString() + "<br>"; s += "Stack:" + ex.StackTrace; Response.Write("Error=" + ex.Message); app.addLog("server exception", "", "", "", s); } Response.End(); }
public int saveTime = 10; //guardar arboles cada x minutos #endregion Fields #region Methods //public string download(int id, string arbol) //{ // string ret = ""; // Grupo grupo = app.getGrupo(arbol); // Arbol a = grupo.arbol; // lock (a) // { // grupo.ts = DateTime.Now; // List<Nodo> pathn = a.getPath(id); // for(int i = pathn.Count - 1; i >=0 ; i--) // { // Nodo n = pathn[i]; // Propuesta op = a.getPropuesta(n.id); // if (op != null) // { // if (ret == "") // { // ModeloDocumento m = a.getModelo(op.modeloID); // ret += "Fecha: " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\r\n"; // ret += "Arbol: " + a.nombre + "\r\n"; // ret += "Creado: " + a.born.ToShortDateString() + " " + a.born.ToShortTimeString() + "\r\n"; // ret += "Objetivo: " + a.objetivo + "\r\n"; // ret += "Consensos alcanzados: " + a.logDocumentos.Count + "\r\n"; // ret += "Usuarios: " + a.usuarios.Count + "\r\n"; // ret += "Admin: " + a.getAdmin().nombre + " (" + a.getAdmin().email + ")\r\n\r\n"; // ret += "Modelo documento: " + m.nombre + "\r\n"; // ret += "Titulo: " + op.titulo + "\r\n\r\n"; // } // ret += "--------------------------------------------------------------- Nivel del arbol " + (pathn.Count - i - 1) + "\r\n"; // ret += "Fecha: " + op.ts.ToShortDateString() + " " + op.ts.ToShortTimeString() + "\r\n"; // foreach (TextoTema tt in op.textos) // { // ret += "Titulo: " + tt.titulo + "\r\n"; // ret += tt.texto.Replace("\n", "\r\n").Replace(""", "\"") + "\r\n\r\n"; // } // ret += "\r\n"; // ret += "\r\n"; // } // } // } // return ret; //} public bool doSimulacionLive(Grupo g, float coopProb) { bool ret = false; lock (g) { Arbol a = g.arbol; float action = coopProb + (float)a.rnd.NextDouble() - 0.5f; if (action > 3f/4f) { //cooperacion, muevo un voto del menor al mayor Nodo mayor = a.getMayorAgregar(0); Nodo menor = a.getMenorQuitar(mayor.id); if (mayor != menor && menor.flores > 0 && !mayor.consensoAlcanzado) { Usuario u = a.quitarFlor(menor); try { a.asignarflor(u, mayor); } catch {} if (mayor.consensoAlcanzado) ret = true; } } else if (action > 2f/4f) { //voto a minorias, muevo un voto del mayor al menor var mayor = a.getMayorQuitar(0); var menor = a.getMenorAgregar(mayor.id); if (mayor != menor && mayor.flores > 0 && !menor.consensoAlcanzado) { Usuario u = a.quitarFlor(mayor); try { a.asignarflor(u, menor); } catch {} if (menor.consensoAlcanzado) ret = true; } } else if (action > 1f / 4f) { //quito alguna flor var mayor = a.getMayorQuitar(0); if (mayor.flores > 0) { a.quitarFlor(mayor); } } else { //creo una rama nueva //seleccion nodo al azar List<Nodo> nodes = a.toList(); Nodo selected = a.rndElement(nodes); //agrego nuevo nodo if (!selected.consensoAlcanzado && selected.nivel < 5) { //agrego nodo //creo texto segun nivel y modelo de documento Modelo m = Modelo.getModelo("nabu.modelos.Accion"); //modelo de simulacion (Accion) Propuesta prop = new Propuesta(); prop.email = g.usuarios[0].email; prop.modeloID = m.id; prop.nivel = selected.nivel + 1; //esta propuesta es para el hijo que voy a crear prop.nodoID = selected.id; prop.titulo = "Documento simulado"; //lleno datos de prueba foreach (Variable v in m.getVariables()) { if (v.id == "s.etiqueta") prop.bag.Add("s.etiqueta", "Sim"); else if (v.id == "s.titulo") prop.bag.Add("s.titulo", "Documento simulado"); else prop.bag.Add(v.id, "Simulacion!!!"); } //me aseguro que el usuario tenga flores o agrego otro if (a.lastSimUsuario.flores.Count < 5) a.lastSimUsuario.flores.Add(new Flor()); else { //busco un usuario con flores a.lastSimUsuario = a.getUsuarioConFloresDisponibles(); } if (a.lastSimUsuario == null) { Usuario u = new Usuario(); u.nombre = "Sim" + g.usuarios.Count + 1; u.email = "Sim" + g.usuarios.Count + 1; u.flores.Add(new Flor()); g.usuarios.Add(u); a.lastSimUsuario = u; } prop.email = a.lastSimUsuario.email; Nodo nuevo = a.addNodo(selected, prop); if (selected.nivel == 1) { selected.nombre = "Sim" + selected.id; } } } } return ret; }
public string HTMLFlores(Nodo n, bool showVariante, Usuario u) { string ret; ret = "<table style='width:100%;'><tr>"; ret += "<td class='votos' style='vertical-align:center;'>"; ret += "<img src='res/icono.png'>"; ret += " " + n.getFloresTotales(); ret += "</td><td style='text-align:right;'>"; if (n.nivel > 0 && showVariante) { if (u.floresDisponibles().Count == 0) ret += "<input type='button' class='btnDis' value='Crear variante' title='No tienes flores disponibles' disabled>"; else ret += "<input type='button' class='btn' value='Crear variante' title='Crea otra propuesta basada en esta' onclick='doVariante(" + n.id + ");'>"; } ret += "</tr></table>"; return ret; }
private int getApoyos(Usuario u, List<Nodo> nodos) { int ret = 0; //obtengo nodos de este usuario List<int> mios = new List<int>(); foreach (Nodo n in nodos) { if (n.email == u.email) mios.Add(n.id); } //obtengo apoyos foreach (Usuario u2 in grupo.usuarios) { foreach (int id in mios) { foreach (Flor f in u2.flores) if (f.id == id) ret++; } } return ret; }
public bool quitarFlor(Nodo n, Usuario u) { bool ret = false; Flor f = u.getFlor(n.id); if (f == null) throw new Exception("El usuario no tiene esa flor para quitar"); //libero la flor al usuario n.flores -= 1; f.id = 0; f.born = DateTime.Now; //borro la parte de la rama que no tenga flores ret = verifyNodoSinFlores(n.id); //actualizo negados actualizarNegados(); //veo si algun nodo alcanza el consenso comprobarConsenso(); return ret; }
public int getApoyos(Usuario u) { return getApoyos(u, toList()); }
public void asignarflor(Usuario u, Nodo n) { //si tiene una flor en nivel anterior la subo, si no uso una de las disponibles //si hay flor en pathn entonces la subo bool subida = false; if (n.consensoAlcanzado) throw new appException("Este debate ya ha alcanzado el consenso"); foreach (Nodo padre in getPath(n.id)) { Flor usada = u.getFlor(padre.id); if (usada != null) { //hay flor en un nodo anterior la subo padre.flores -= 1; usada.id = n.id; usada.born = DateTime.Now; n.flores += 1; subida = true; break; } } if (!subida) { //uso una flor disponible List<Flor> disponibles = u.floresDisponibles(); if (disponibles.Count > 0) { disponibles[0].id = n.id; disponibles[0].born = DateTime.Now; n.flores += 1; } else throw new appException("No tienes flores disponibles"); } //compruebo consenso alcanzado comprobarConsenso(n); //actualizo negados actualizarNegados(); }