예제 #1
0
 /*
  * Метод реализует сборку страницы для произведения вычислений на стороне клиента.
  * Идентификатор пользователя берется из значения сессии.
  * Входные параметры:
  * 1) Строка с идентификатором задачи. В строке должно находиться целое неотрицательное число или -1.
  * По умолчанию стоит -1, что обозначает, что нужный идентификатор не был установлен.
  * Все прочие значения являются ошибкой.
  * 2) Строка с именем функции. Имя функции может быть произвольной строкой содержащей печатные символы.
  * По умолчанию стоит -1, что обозначает, что нужное имя не было установлено.
  * Все прочие значения являются ошибкой.
  * Выходные параметры:
  * ActionResult, с помощью которого пользователь перенаправляется на страницу Master.
  * Если в ходе работы произошли ошибки, выводится сообщение об этом.
  * Побочные эффекты:
  * В ходе выполнения метода:
  * 1) может модифицироваться файл /App_Data/log.txt;
  * 2) устанавливается время последней активности пользователя.
  */
 public ActionResult Calculation(string task = "-1", string func = "-1")
 {
     try
     {
         Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));
         db.setUserLastActivity((int)System.Web.HttpContext.Current.Session["user_id"], DateTime.UtcNow);
         db.close();
         if (task != "-1" && func != "-1")
         {
             string taskFile = "/Content/data/" + task + ".js";
             string funcFile = "/Content/func/" + func + ".js";
             string html     = "<script src=\"" + taskFile + "\"> </script>";
             html += "<script src=\"" + funcFile + "\"> </script>";
             html += "<script src=\"/Scripts/client_calc.js\"> </script>";
             html += "<script> makeCalculation(\"" + task + "\"); </script>";
             return(Content(html));
         }
         return(View("Master"));
     }
     catch (Exception e)
     {
         System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message);
         ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже.";
         return(View("Master"));
     }
 }
예제 #2
0
 /*
  * Метод возвращает имя функции поставленой задачи пользователю с ником login.
  * Входные параметры:
  * строка с логином пользователя.
  * Выходные параметры:
  * строка с именем функции. Если ошибка, то строка равна null.
  */
 public string getFunc(string login)
 {
     try
     {
         Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));//обращаемся к базе
         Models.User             u  = db.getUserByLogin(login);
         Models.Task             t  = u.getTask();
         return(t.getFunctionName());
     }
     catch (Exception)
     {
         return(null);
     }
 }
예제 #3
0
        /*
         * Метод собирает информацию о результате.
         * Идентификатор пользователя берется из значения сессии.
         *
         * Выходные параметры:
         * ActionResult, с помощью которого пользователь перенаправляется на страницу Results.
         * Если в ходе работы произошли ошибки, выводится сообщение об этом.
         * Побочные эффекты:
         * В ходе выполнения метода:
         * 1) может модифицироваться файл /App_Data/log.txt;
         */
        public ActionResult Results()
        {//Форма статуса вычислений. Если вычисление закончено, то показан результат
            try
            {
                Models.DatabaseMediator db    = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~")); //обращаемся к базе
                Models.Task[]           array = db.getUserTasks((int)System.Web.HttpContext.Current.Session["user_id"]);         //выцыганиваем id юзера из сессии
                db.close();
                //ну и как то это всё обработали и  вывели

                List <String> list = new List <String>();
                string        line;
                foreach (Models.Task t in array)
                {
                    if (t.isSolved())
                    {
                        // выводим
                        using (StreamReader sr = new StreamReader(t.getResultFilePath()))
                        {
                            while ((line = sr.ReadLine()) != null)
                            {
                                list.Add(t.getTaskId() + ") " + line);
                            }
                        }
                    }
                }
                if (list.Count == 0)
                {
                    ViewBag.Out = null;
                }
                else
                {
                    ViewBag.Out = list;
                }
            }
            catch (Exception e)
            {
                System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message);
                ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже.";
                return(View("Master"));
            }

            return(View());
        }
예제 #4
0
        /*
         * Метод отвечающий за сбор результата с клиента. Если существует родительская задача, её состояние обновляется.
         * Предполагается, что метод выполняется в фоновом для пользователя режиме.
         * Идентификатор пользователя берется из значения сессии.
         * Входные параметры:
         * 1) Строка с идентификатором задачи. В строке должно находиться целое неотрицательное число или -1.
         * По умолчанию стоит -1, что обозначает, что нужный идентификатор не был установлен.
         * Все прочие значения являются ошибкой.
         * 2) Строка с ответом на задачу. Ограничения не накладываются.
         * Выходные параметры:
         * ActionResult, с помощью которого пользователю предоставляется страница TransferOut.
         * Побочные эффекты:
         * 1) Ответ записывается в файл с № задачи.
         * 2) В ходе работы может модифицироваться файл /App_Data/log.txt;
         */
        public ActionResult TransferOut(string task, string result)
        {
            try
            {
                int taskId = Convert.ToInt32(task);//каким-то образом получили id решеной задачи

                Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));
                Models.Task             t  = db.loadTask(taskId); //нашли нужную задачу
                t.setAnswer(result);                              //записали ответ
                db.saveTask(t);                                   //сохранили в базу

                int  userId = (int)System.Web.HttpContext.Current.Session["user_id"];
                User u      = db.getUser(userId);
                u.resetTask();
                db.updateUser(u);

                int parent = t.getParentTaskId();
                if (parent != -1)                            //если есть родитель пишем результат в родителя
                {
                    Models.Task t2  = db.loadTask(parent);   //нашли родительскую задачу
                    bool        fin = t2.updateTask(result); //обновили её
                    db.saveTask(t2);
                    db.close();
                    if (fin)
                    {//если все данные родительской задачи получены, то ставим на выполнение
                        Models.Scheduler s = new Models.Scheduler(System.Web.HttpContext.Current.Server.MapPath("~"));
                        while (!s.setTask(t2))
                        {
                            System.Threading.Thread.Sleep(2000);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message);
                ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже.";
                return(View("Master"));
            }

            return(View());
        }
예제 #5
0
 /*
  * Метод возвращает идентификатор пользователя с ником login, если ему была поставлена задача.
  * Входные параметры:
  * строка с логином пользователя.
  * Выходные параметры:
  * строка с идентификатором пользователя. Если ошибка, то строка равна null.
  */
 public string getUserIdWithTask(string login)
 {
     try
     {
         Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));//обращаемся к базе
         Models.User             u  = db.getUserByLogin(login);
         if (u.getTask() != null)
         {
             return(u.getId().ToString());
         }
         else
         {
             return(null);
         }
     }
     catch (Exception)
     {
         return(null);
     }
 }
예제 #6
0
 /*
  * Метод в котором проверяется решает ли пользователь с данным идентификатором задачу поставленную текущим пользователем.
  * Идентификатор текущего пользователя берется из значения сессии.
  * Входные данные:
  * Идентификатор проверяемого пользователя: целое неотрицательное число или -1.
  * По умолчанию стоит -1, что обозначает, что нужный идентификатор не был установлен.
  * Все прочие значения являются ошибкой.
  * Выходные данные:
  * Булева переменная, обозначающая ответ.
  */
 public bool checkUser(int id)
 {
     try
     {
         int masterId = (int)System.Web.HttpContext.Current.Session["user_id"];
         Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));
         Task t = db.getUser(id).getTask();
         if (t == null)
         {
             return(true);
         }
         while (t.getParentTaskId() != -1)
         {
             t = db.loadTask(t.getParentTaskId());
         }
         return(t.getOwnerId() != masterId);
     }
     catch (Exception e)
     {
         throw e;
     }
 }
예제 #7
0
        public ActionResult Login(string username, string password)
        {
            try
            {
                SHA256Managed          hash      = new SHA256Managed();
                byte[]                 hashBytes = hash.ComputeHash(Encoding.UTF8.GetBytes(username + password));
                string                 hashStr   = BitConverter.ToString(hashBytes).Replace("-", "");
                System.IO.StreamReader file      = new System.IO.StreamReader(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Users.txt"),
                                                                                             FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
                string line;
                while ((line = file.ReadLine()) != null)
                {
                    if (line != "")
                    {
                        string[] logins = line.Split(' ');
                        if (hashStr == logins[1])
                        {
                            Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));//обращаемся к базе
                            Models.User             u  = db.getUserByLogin(logins[0]);
                            db.setUserLastActivity(u.getId(), DateTime.UtcNow);
                            System.Web.HttpContext.Current.Session["user_id"] = u.getId(); //выцыганиваем id из базы
                            HttpContext.Response.Cookies["user"].Value        = "id=" + u.getId().ToString();
                            db.close();                                                    //закрыли базу
                            FormsAuthentication.SetAuthCookie(username, false);
                            HttpContext.Response.Cookies["login"].Value = username;
                            System.IO.StreamReader file1 = new System.IO.StreamReader(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/OnlineUsers.txt"),
                                                                                                     FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
                            List <KeyValuePair <string, string> > users = new List <KeyValuePair <string, string> >();
                            string line1;
                            while ((line1 = file1.ReadLine()) != null)
                            {
                                if (line1 != "")
                                {
                                    string[] str = line1.Split(' ');
                                    users.Add(new KeyValuePair <string, string>(str[0], str[1]));
                                }
                            }
                            file1.Close();
                            System.IO.StreamWriter file2 = new System.IO.StreamWriter(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/OnlineUsers.txt"),
                                                                                                     FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite));
                            users.Add(new KeyValuePair <string, string>(username, Request.UserHostAddress));
                            string result = "";
                            foreach (var str in users)
                            {
                                result += str.Key + " " + str.Value + "\n";
                            }
                            file2.Write(result);
                            file2.Close();

                            file.Close();
                            return(View("Master"));
                        }
                    }
                }
                file.Close();
                return(View("Index"));
            }
            catch (Exception e)
            {
                System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message);
                ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже.";
                return(View("Index"));
            }
        }