예제 #1
0
        public static OmegaUp obtenerParaOMI(string olimpiada, TipoOlimpiada tipoOlimpiada)
        {
            Acceso        db    = new Acceso();
            StringBuilder query = new StringBuilder();

            query.Append(" select * from OmegaUp where tipo = ");
            query.Append(Cadenas.comillas(Instruccion.POLL.ToString().ToLower()));
            query.Append(" and olimpiada = ");
            query.Append(Cadenas.comillas(olimpiada));
            query.Append(" and clase = ");
            query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower()));

            db.EjecutarQuery(query.ToString());

            DataTable table = db.getTable();

            if (table.Rows.Count == 0)
            {
                return(null);
            }

            OmegaUp o = new OmegaUp();

            o.llenarDatos(table.Rows[0]);

            return(o);
        }
예제 #2
0
        public static List <OmegaUp> obtenerInstrucciones(Instruccion i = Instruccion.NULL)
        {
            Acceso         db    = new Acceso();
            StringBuilder  query = new StringBuilder();
            List <OmegaUp> lista = new List <OmegaUp>();

            query.Append(" select * from omegaup ");
            if (i != Instruccion.NULL)
            {
                query.Append(" where tipo = ");
                query.Append(Cadenas.comillas(i.ToString().ToLower()));
            }
            query.Append(" order by tipo asc ");

            db.EjecutarQuery(query.ToString());

            DataTable table = db.getTable();

            foreach (DataRow r in table.Rows)
            {
                OmegaUp o = new OmegaUp();
                o.llenarDatos(r);

                lista.Add(o);
            }

            return(lista);
        }
예제 #3
0
        public static void StartScoreboard()
        {
            // Primero matamos todos los status que estén en un estado de error
            List <OmegaUp> status = OmegaUp.obtenerInstrucciones(Instruccion.STATUS);

            foreach (OmegaUp s in status)
            {
                if (s.status != Status.OK)
                {
                    s.borrar();
                }
                else
                {
                    // Si encontramos un OK, no iniciamos nada pues ya hay un proceso corriendo
                    return;
                }
            }

            // Obtenemos la dirección del exe
            string directorio = ConfigurationManager.AppSettings.Get(SCOREBOARD_DIRECTORY_STRING);
            string exe        = ConfigurationManager.AppSettings.Get(SCOREBOARD_EXE_STRING);

            ProcessStartInfo psi = new ProcessStartInfo();

            psi.WorkingDirectory = directorio;
            psi.FileName         = exe;
            Process.Start(psi);

            // Esperamos un par de segundos a que el proceso empiece y darle tiempo a la página
            // a que lo registre
            System.Threading.Thread.Sleep(SLEEP_TIME);
        }
예제 #4
0
        /// <summary>
        /// Dado que las olimpiadas son pocas y a que se hacen muchas llamadas a la base para obtener estos objetos
        /// los cargamos una vez por aplicacion y los dejamos ahi
        /// </summary>
        /// <returns></returns>
        private static Dictionary <string, Olimpiada> getOlimpiadas(TipoOlimpiada tipoOlimpiada)
        {
            Dictionary <string, Olimpiada> olimpiadas;
            string application = obtenerApplicationString(tipoOlimpiada);

            olimpiadas = (Dictionary <string, Olimpiada>)HttpContext.Current.Application[application];

            if (olimpiadas == null)
            {
                olimpiadas = cargarOlimpiadas(tipoOlimpiada);
                HttpContext.Current.Application[application] = olimpiadas;

                // Cargamos las instrucciones en caso de que haya un scoreboard activo
                List <OmegaUp> polls = OmegaUp.obtenerInstrucciones(OmegaUp.Instruccion.POLL);

                foreach (OmegaUp p in polls)
                {
                    if (p.tipoOlimpiada == tipoOlimpiada)
                    {
                        Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(p.olimpiada, p.tipoOlimpiada);
                        o.liveResults = true;
                    }
                }
            }

            return(olimpiadas);
        }
예제 #5
0
 public static void nuevaInstruccion(Instruccion instruccion, bool unica)
 {
     if (!unica || OmegaUp.obtenerInstrucciones(instruccion).Count == 0)
     {
         OmegaUp o = new OmegaUp();
         o.instruccion = instruccion;
         o.guardarNuevo();
     }
 }
예제 #6
0
        public static List <Medallero> obtenerTablaEstadosSecreta(string clave, TipoOlimpiada tipoOlimpiada)
        {
            OmegaUp           poll       = OmegaUp.obtenerParaOMI(clave, tipoOlimpiada);
            List <Resultados> resultados = Resultados.cargarResultadosSecretos(clave, tipoOlimpiada, poll.dia);
            Dictionary <string, Medallero> diccionario = new Dictionary <string, Medallero>();

            foreach (Resultados resultado in resultados)
            {
                Medallero m = null;
                if (diccionario.ContainsKey(resultado.estado))
                {
                    m = diccionario[resultado.estado];
                }
                else
                {
                    m       = new Medallero();
                    m.clave = resultado.estado;
                    diccionario.Add(resultado.estado, m);
                }
                switch (resultado.medalla)
                {
                case Resultados.TipoMedalla.ORO:
                case Resultados.TipoMedalla.ORO_1:
                case Resultados.TipoMedalla.ORO_2:
                case Resultados.TipoMedalla.ORO_3:
                    m.oros++;
                    break;

                case Resultados.TipoMedalla.PLATA:
                    m.platas++;
                    break;

                case Resultados.TipoMedalla.BRONCE:
                    m.bronces++;
                    break;
                }
                m.puntos += resultado.total;
                m.lugar++;
            }

            List <Medallero> medallero = new List <Medallero>();

            foreach (Medallero m in diccionario.Values)
            {
                m.promedio = m.puntos / m.lugar;
                m.lugar    = 0;
                medallero.Add(m);
            }
            medallero.Sort();

            for (int i = 0; i < medallero.Count; i++)
            {
                medallero[i].lugar = i + 1;
            }

            return(medallero);
        }
예제 #7
0
        public static OmegaUp obtenerConClave(int clave)
        {
            Acceso        db    = new Acceso();
            StringBuilder query = new StringBuilder();

            query.Append("select * from OmegaUp where clave = ");
            query.Append(clave);

            db.EjecutarQuery(query.ToString());

            DataTable table = db.getTable();

            if (table.Rows.Count == 0)
            {
                return(null);
            }

            OmegaUp o = new OmegaUp();

            o.llenarDatos(table.Rows[0]);

            return(o);
        }
예제 #8
0
        public OmegaUp calculateCachedResults()
        {
            try
            {
                OmegaUp poll = OmegaUp.obtenerParaOMI(this.numero, this.tipoOlimpiada);
                if (poll == null)
                {
                    this.liveResults = false;
                    return(poll);
                }

                if (this.cachedResults == null || resultados == null)
                {
                    cacheResults(poll.dia);
                    this.lastUpdate = poll.timestamp;
                    return(poll);
                }

                if (poll.timestamp.CompareTo(lastUpdate) <= 0)
                {
                    return(poll);
                }

                this.lastUpdate = poll.timestamp;
                cacheResults(poll.dia);

                return(poll);
            }
            catch (Exception e)
            {
                Log.add(Log.TipoLog.SCOREBOARD, "Excepción tratando de cachear resultados para " + this.tipoOlimpiada + " " + this.numero);
                Log.add(Log.TipoLog.SCOREBOARD, e.ToString());

                return(null);
            }
        }