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(); public bool Code_Test() { try { return true; } catch(Exception) { return false; } } } class Index_Task_handler { int current_id = 0; public LinkedList results = new LinkedList(); Dictionary)> tasks = new Dictionary)>(); public void Make_request(Action 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 result_handler; Get_Index_Result result; if (tasks.TryGetValue(id, out (Get_Index, Action) 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 results = new LinkedList(); Dictionary)> tasks = new Dictionary)>(); public void Make_request(Action 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 result_handler; Login_Result result; if (tasks.TryGetValue(id, out (Login, Action) 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); Initialize.default_logger.LogInformation($"[{DateTime.Now}] login success"); 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); else if (result.Error_info.Length == 0) result.Error_info = "Login:" + e.Message; else result.Error_info = "Login:" + e.Message + "error_info:" + result.Error_info; Initialize.default_logger.LogWarning($"[{DateTime.Now}] {result.Error_info}"); tasks[id].Item2(result); tasks.Remove(id); } public List>? Newest_cookie() => results.First()?.cookie; public Login_Result Newest_result() => results.First(); } class ToCourse_Task_Handler { int current_id = 0; public LinkedListresults = new LinkedList(); Dictionary)> tasks = new Dictionary)>(); public void Make_request(Action 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 result_handler; To_Course_Result result; if(tasks.TryGetValue(id,out (To_Course,Action) 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); } } }