2024-03-12 16:15:15 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace CSS_Solution.Request
|
|
|
|
|
{
|
|
|
|
|
class Task_handler
|
|
|
|
|
{
|
|
|
|
|
public static Index_Task_handler index_Task_Handler = new Index_Task_handler();
|
|
|
|
|
public static Login_Task_handler login_Task_Handler = new Login_Task_handler();
|
|
|
|
|
public static ToCourse_Task_Handler toCourse_Task_Handler = new ToCourse_Task_Handler();
|
2024-03-14 00:02:17 +08:00
|
|
|
|
public bool Code_Test()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(Exception)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-12 16:15:15 +08:00
|
|
|
|
}
|
|
|
|
|
class Index_Task_handler
|
|
|
|
|
{
|
|
|
|
|
int current_id = 0;
|
|
|
|
|
public LinkedList<Get_Index_Result> results = new LinkedList<Get_Index_Result>();
|
|
|
|
|
Dictionary<int, (Get_Index, Action<Get_Index_Result>)> tasks = new Dictionary<int, (Get_Index, Action<Get_Index_Result>)>();
|
|
|
|
|
public void Make_request(Action<Get_Index_Result> result_handler)
|
|
|
|
|
{
|
|
|
|
|
current_id++;
|
|
|
|
|
Get_Index get_Index = new Get_Index(current_id, GetIndex_success, GetIndex_failed);
|
|
|
|
|
get_Index.Run();
|
|
|
|
|
tasks.Add(current_id, (get_Index, result_handler));
|
|
|
|
|
}
|
|
|
|
|
public void GetIndex_success(int id)
|
|
|
|
|
{
|
|
|
|
|
Action<Get_Index_Result> result_handler;
|
|
|
|
|
Get_Index_Result result;
|
|
|
|
|
if (tasks.TryGetValue(id, out (Get_Index, Action<Get_Index_Result>) value))
|
|
|
|
|
{
|
|
|
|
|
Get_Index task = value.Item1;
|
|
|
|
|
result_handler = value.Item2;
|
|
|
|
|
result = new Get_Index_Result(task);
|
|
|
|
|
if (result.Wrong_Result())
|
|
|
|
|
{
|
|
|
|
|
GetIndex_failed(id, new HttpRequestException("Get_Index Result info error, Check it out!"), result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
results.AddFirst(result);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
GetIndex_failed(id, new KeyNotFoundException($"Get_Index: who called me? I even don't have ID {id}"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
tasks.Remove(id);
|
|
|
|
|
result_handler(result);
|
|
|
|
|
}
|
|
|
|
|
public void GetIndex_failed(int id, Exception e, Get_Index_Result? result = null)
|
|
|
|
|
{
|
|
|
|
|
if (e.GetType() == typeof(KeyNotFoundException))
|
|
|
|
|
{
|
|
|
|
|
Initialize.default_logger.LogWarning($"[{DateTime.Now}] ToIndex: {e.Message}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (result == null)
|
|
|
|
|
result = new Get_Index_Result(e.Message);
|
|
|
|
|
else
|
|
|
|
|
result.Error_info = e.Message;
|
|
|
|
|
tasks[id].Item2(result);
|
|
|
|
|
tasks.Remove(id);
|
|
|
|
|
}
|
|
|
|
|
public Get_Index_Result Newest_Result() => results.First();
|
|
|
|
|
}
|
|
|
|
|
class Login_Task_handler
|
|
|
|
|
{
|
|
|
|
|
int current_id = 0;
|
|
|
|
|
public LinkedList<Login_Result> results = new LinkedList<Login_Result>();
|
|
|
|
|
Dictionary<int, (Login, Action<Login_Result>)> tasks = new Dictionary<int, (Login, Action<Login_Result>)>();
|
|
|
|
|
public void Make_request(Action<Login_Result> result_handler, Get_Index_Result? last_result)
|
|
|
|
|
{
|
|
|
|
|
current_id++;
|
|
|
|
|
last_result ??= Task_handler.index_Task_Handler.Newest_Result();
|
|
|
|
|
if (last_result == null)
|
|
|
|
|
throw new InvalidOperationException("No usable Get_Index_Result for Login");
|
|
|
|
|
Login login = new Login(current_id, last_result, Login_success, Login_failed);
|
|
|
|
|
login.Run();
|
|
|
|
|
tasks.Add(current_id, (login, result_handler));
|
|
|
|
|
}
|
|
|
|
|
public void Login_success(int id)
|
|
|
|
|
{
|
|
|
|
|
Action<Login_Result> result_handler;
|
|
|
|
|
Login_Result result;
|
|
|
|
|
if (tasks.TryGetValue(id, out (Login, Action<Login_Result>) value))
|
|
|
|
|
{
|
|
|
|
|
Login task = value.Item1;
|
|
|
|
|
result_handler = value.Item2;
|
|
|
|
|
result = new Login_Result(task);
|
|
|
|
|
if (result.Wrong_Result())
|
|
|
|
|
{
|
|
|
|
|
Login_failed(id, new HttpRequestException("Login Result info error, Check it out!"), result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
results.AddFirst(result);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Login_failed(id, new KeyNotFoundException($"Login: who called me? I even don't have ID {id}"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
tasks.Remove(id);
|
2024-03-14 00:02:17 +08:00
|
|
|
|
Initialize.default_logger.LogInformation($"[{DateTime.Now}] login success");
|
2024-03-12 16:15:15 +08:00
|
|
|
|
result_handler(result);
|
|
|
|
|
}
|
|
|
|
|
public void Login_failed(int id, Exception e, Login_Result? result = null)
|
|
|
|
|
{
|
|
|
|
|
if (e.GetType() == typeof(KeyNotFoundException))
|
|
|
|
|
{
|
|
|
|
|
Initialize.default_logger.LogWarning($"[{DateTime.Now}] Login: {e.Message}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (result == null)
|
|
|
|
|
result = new Login_Result(e.Message);
|
2024-03-14 00:02:17 +08:00
|
|
|
|
else if (result.Error_info.Length == 0)
|
|
|
|
|
result.Error_info = "Login:" + e.Message;
|
2024-03-12 16:15:15 +08:00
|
|
|
|
else
|
2024-03-14 00:02:17 +08:00
|
|
|
|
result.Error_info = "Login:" + e.Message + "error_info:" + result.Error_info;
|
|
|
|
|
Initialize.default_logger.LogWarning($"[{DateTime.Now}] {result.Error_info}");
|
2024-03-12 16:15:15 +08:00
|
|
|
|
tasks[id].Item2(result);
|
|
|
|
|
tasks.Remove(id);
|
|
|
|
|
}
|
|
|
|
|
public List<KeyValuePair<string,string>>? Newest_cookie() => results.First()?.cookie;
|
|
|
|
|
public Login_Result Newest_result() => results.First();
|
|
|
|
|
}
|
|
|
|
|
class ToCourse_Task_Handler
|
|
|
|
|
{
|
|
|
|
|
int current_id = 0;
|
|
|
|
|
public LinkedList<To_Course_Result>results = new LinkedList<To_Course_Result>();
|
|
|
|
|
Dictionary<int, (To_Course, Action<To_Course_Result>)> tasks = new Dictionary<int, (To_Course, Action<To_Course_Result>)>();
|
|
|
|
|
public void Make_request(Action<To_Course_Result> result_handler,Login_Result? last_result)
|
|
|
|
|
{
|
|
|
|
|
current_id++;
|
|
|
|
|
last_result ??=Task_handler.login_Task_Handler.Newest_result();
|
|
|
|
|
if(last_result == null)
|
|
|
|
|
throw new InvalidOperationException("No usable Login_Result for Login");
|
|
|
|
|
To_Course to_Course = new To_Course(current_id, last_result,To_Course_success,To_Course_failed);
|
|
|
|
|
to_Course.Run();
|
|
|
|
|
tasks.Add(current_id, (to_Course, result_handler));
|
|
|
|
|
}
|
|
|
|
|
public void To_Course_success(int id)
|
|
|
|
|
{
|
|
|
|
|
Action<To_Course_Result> result_handler;
|
|
|
|
|
To_Course_Result result;
|
|
|
|
|
if(tasks.TryGetValue(id,out (To_Course,Action<To_Course_Result>) value))
|
|
|
|
|
{
|
|
|
|
|
To_Course task = value.Item1;
|
|
|
|
|
result_handler = value.Item2;
|
|
|
|
|
result = new To_Course_Result(task);
|
|
|
|
|
if(result.Wrong_Result())
|
|
|
|
|
{
|
|
|
|
|
To_Course_failed(id, new HttpRequestException("To_Course Result info error, Check it out!"), result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
results.AddLast(result);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
To_Course_failed(id, new KeyNotFoundException($"To_Course: who called me? I even don't have ID {id}"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
tasks.Remove(id);
|
|
|
|
|
result_handler(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void To_Course_failed(int id,Exception e,To_Course_Result? result = null)
|
|
|
|
|
{
|
|
|
|
|
if (e.GetType() == typeof(KeyNotFoundException))
|
|
|
|
|
{
|
|
|
|
|
Initialize.default_logger.LogWarning($"[{DateTime.Now}] Login: {e.Message}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(result==null)
|
|
|
|
|
result = new To_Course_Result(e.Message);
|
|
|
|
|
else
|
|
|
|
|
result.Error_info = e.Message;
|
|
|
|
|
tasks[id].Item2(result);
|
|
|
|
|
tasks.Remove(id);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|