using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace DBAccessPluginNamespace
{
public enum UserTypeEnum {None, Student, Teacher, Admin };
// Информация о пользователе для доступа к сайту, а также для работы с сайтом
// Это можно сохранять между запусками программы
public class SiteAccessProvider
{
// Данные о пользователе
public string ShortFIO { get; set; } = "";
public string FullFIO { get; set; } = "";
public string Password { get; set; } = "";
public string Group { get; set; } = "";
public UserTypeEnum UserType { get; set; } = UserTypeEnum.None;
// Базовый адрес папки со скриптами (адрес сервера)
public string ServAddr = "";
// Клиент для обработки запросов http
private HttpClient client = null;
///
/// Запрос на добавление информации об активности в БДИм
///
/// Имя задания
/// Имя урока
/// Тип записи - например, выполнено или нет задание
/// Дополнительные данные - например, текст программы
///
async public Task SendPostRequest(string TaskName, string LessonName, string TypeString, string ContentInfo)
{
// Если не выполнен вход, то выход с ошибкой
if (UserType == UserTypeEnum.None) return "Error";
// Если не выполнен вход, то выход с ошибкой
if (UserType != UserTypeEnum.Student) return "Cannot write activity, because you're teacher!";
// Если клиент ещё не создан был, пересоздаём
if (client == null)
{
client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(10);
}
// Словарик для параметров запроса
var values = new Dictionary
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "shortFIO", ShortFIO }, // shortFIO или FIO, и они должны совпадать с такими же в базе
{"FIO", FullFIO },
{ "taskName", TaskName },
{ "lessonName", LessonName },
{ "type", TypeString },
{ "content", ContentInfo },
{ "password", Password }
};
// Отправка запроса на сервер
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "//add.php", content);
return await response.Content.ReadAsStringAsync();
}
public void Clear()
{
ShortFIO = "";
FullFIO = "";
Password = "";
Group = "";
UserType = UserTypeEnum.None;
}
///
/// Получение начальной информации (начальная страница)
///
///
async public Task GetContents()
{
// Если клиент ещё не создан был, пересоздаём
if (client == null)
{
client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(10);
}
// Тут не столь важно что отправлять, можно и пустой список параметров
var values = new Dictionary
{
{ "password", "123" },
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/index.php", content);
return await response.Content.ReadAsStringAsync();
}
///
/// Получить из БД список групп
///
///
async public Task GetGroupsNames(string ServerAddr = "")
{
// Этот метод может быть вызван без предварительного входа
if (ServerAddr != "")
ServAddr = ServerAddr;
if (ServAddr == "") return "Error";
// Если клиент ещё не создан был, пересоздаём
if (client == null)
{
client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(10);
}
var values = new Dictionary();
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/groupslist.php", content);
return await response.Content.ReadAsStringAsync();
}
///
/// Получить из БД список учеников определенной группы
///
///
async public Task GetUsersNames(string GroupName, string ServerAddr = "")
{
// Этот метод может быть вызван без предварительного входа
if (ServerAddr != "" || GroupName == "")
ServAddr = ServerAddr;
if (ServAddr == "") return "Error";
// Если клиент ещё не создан был, пересоздаём
if (client == null)
{
client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(10);
}
Group = GroupName;
var values = new Dictionary
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "userGroup", Group } // shortFIO или FIO, и они должны совпадать с такими же в базе
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/userslist.php", content);
return await response.Content.ReadAsStringAsync();
}
async public Task Login(string shortFIO, string fullFIO, string password, string ServerAddr = "")
{
// Если передана строка адреса - то и хорошо, а если нет, то используем предыдущее значение
Clear();
if (ServerAddr != "")
ServAddr = ServerAddr;
if (ServAddr == "" && ServerAddr == "") return "Error";
if (shortFIO == "" && fullFIO == "") return "Error";
ShortFIO = shortFIO;
FullFIO = fullFIO;
Password = password;
if (client == null)
{
client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(10);
}
// Словарик для параметров запроса
var values = new Dictionary
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "shortFIO", ShortFIO }, // shortFIO или FIO, и они должны совпадать с такими же в базе
{ "FIO", FullFIO },
{ "password", Password}
};
// Отправка запроса на сервер
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/login.php", content);
string responseText = await response.Content.ReadAsStringAsync();
// Разобрать ответ от сервера - как пары key:value;
// Это сложно, т.к. тут могут быть сообщения об ошибках
//return responseText;
var pieces = responseText.Split(';');
// Сбрасываем тип пользователя, по нему и будем проверять успешность ответа
// В сообщениях об ошибках его не должно быть
foreach(var s in pieces)
{
if (s.IndexOf(':') < 1) continue;
var pair = s.Split(':');
switch(pair[0])
{
case "FIO" : FullFIO = pair[1]; break;
case "ShortFIO": ShortFIO = pair[1]; break;
case "type" : {
if (pair[1] == "prepod") UserType = UserTypeEnum.Teacher;
else if (pair[1] == "student") UserType = UserTypeEnum.Student;
break;
}
}
}
if(UserType == UserTypeEnum.None)
{
Clear();
return responseText;
}
return "Success";
}
async public Task GetRating(string shortFIO, string fullFIO, string password)
{
var values = new Dictionary
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
//{ "shortFIO", ShortFIO }, // shortFIO или FIO, и они должны совпадать с такими же в базе
{ "FIO", FullFIO },
//{ "password", Password}
};
// Отправка запроса на сервер
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/getRating.php", content);
string responseText = await response.Content.ReadAsStringAsync();
var pieces = responseText.Split(';');
var res = "";
var ClassTasksSolved = 0;
var ControlTasksSolved = 0;
var HomeworkTasksSolved = 0;
var AdditionalTasksSolved = 0;
try
{
foreach (var s in pieces)
{
if (s.IndexOf(':') < 1) continue;
var pair = s.Split(':');
switch (pair[0])
{
case "ClassTasks":
ClassTasksSolved = int.Parse(pair[2]);
break;
case "ControlTasks":
ControlTasksSolved = int.Parse(pair[2]);
break;
case "HomeworkTasks":
HomeworkTasksSolved = int.Parse(pair[2]);
break;
case "AdditionalTasks":
AdditionalTasksSolved = int.Parse(pair[2]);
break;
}
}
// великая формула !!!
var Rating = ClassTasksSolved * 1 + ControlTasksSolved * 5 + HomeworkTasksSolved * 3 + AdditionalTasksSolved * 2;
var Details = $" (Осн: {ClassTasksSolved}×1, Доп: {AdditionalTasksSolved}×2, ДЗ: {HomeworkTasksSolved}×3, КР: {ControlTasksSolved}×5)";
res = Rating.ToString() + '|' + Details;
}
catch (Exception e)
{
res = e.Message;
}
return res;
}
// Так как мы на сервере пока ничего не запоминаем, то процесс выхода - просто стереть всё
public void Logout()
{
// Данные о пользователе
Clear();
if (client != null)
client.Dispose();
client = null;
}
}
}