/
AstroJohn
/
MailRobot
Обзор
Документация
Войти
/
AstroJohn
/
MailRobot
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
WcfMailRobotService/CheckLogService.cs
301 строка
11 KB
AstroJohn
GetOblast GetTeam
11 апр 2026, 17:23
11 апр 2026, 17:23
8cd6106
Код
Авторство
О чём код?
using CsConfig; using LogProcessingModels.Configuration; using LogProcessingModels.Parsing; using MailRobot.Checker; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.ServiceModel; using System.ServiceModel.Channels; namespace MailRobot.WcfMailRobotService { public class CheckLogService : ICheckLogService { private const string ApiCode = "zhopasushami"; public string GetOblast(string callsign, string contestName) { try { var checkerObject = CheckerCollection.FirstOrDefault(x => x.Params.ParserParameters.ContestName == contestName); if (checkerObject == null) return string.Empty; var checker = checkerObject.Checker; return checker.LogScoringGate.GetOblast(callsign); } catch (Exception) { return string.Empty; } } public string GetTeam(string callsign, string contestName) { try { var checkerObject = CheckerCollection.FirstOrDefault(x => x.Params.ParserParameters.ContestName == contestName); if (checkerObject == null) return string.Empty; var checker = checkerObject.Checker; return checker.LogScoringGate.GetTeam(callsign); } catch (Exception) { return string.Empty; } } public List<KeyValuePair<string, string>> GetCurrentContests(out string errorMessage, string isoLanguage = "ru", string apiCode = null, string forwardedFor = null, string remoteAddr = null) { errorMessage = string.Empty; WriteLog("GetCurrentContests", $"isoLanguage = {isoLanguage ?? "not defined"}, apiCode = {apiCode ?? "not defined"}, remoteAddr = {remoteAddr ?? "not defined"}, forwardedFor = {forwardedFor ?? "not defined"}"); if (apiCode != ApiCode) return null; try { return CheckerCollection.Select ( x => new KeyValuePair<string, string> ( x.Params.ParserParameters.ContestName, isoLanguage == "ru" ? x.Params.ParserParameters.UserFriendlyContestName : x.Params.ParserParameters.UserFriendlyContestNameEn ) ) .ToList(); } catch (Exception ex) { errorMessage = $"Ошибка в методе GetCurrentContests: {ex.Message}"; return new List<KeyValuePair<string, string>>(); } } public LogParsingResult GetLogParsingResult(string contestName, string fileName, byte[] fileBytesArray, bool loadToDb, out string errorMessage, string apiCode = null, string forwardedFor = null, string remoteAddr = null) { errorMessage = string.Empty; WriteLog("GetLogParsingResult", $"contestName = {contestName ?? "not defined"}, fileName = {fileName ?? "not defined"}, remoteAddr = {remoteAddr ?? "not defined"}, forwardedFor = {forwardedFor ?? "not defined"}"); if (apiCode != ApiCode) return null; if (!ContestCollections.Contains(contestName)) return null; try { var checkerObject = CheckerCollection.FirstOrDefault(x => x.Params.ParserParameters.ContestName == contestName); if (checkerObject == null) throw new ArgumentException($"{nameof(checkerObject)} == null", nameof(checkerObject)); var parameters = checkerObject.Params; var checker = checkerObject.Checker; ParsedLog parsedLog = null; var isParsedSuccesfully = checker.ParseLog(fileName, fileBytesArray.Length, DateTime.Now, fileBytesArray, parameters, ref parsedLog, loadToDb); var result = new LogParsingResult { IsParsedSuccessfully = isParsedSuccesfully, Message = parsedLog.ParseResult.MessageRuHtml, MessageEn = parsedLog.ParseResult.MessageEn, Callsign = parsedLog.Callsign, Category = parsedLog.Category, ClaimedResultsText = parsedLog.ClaimedResultsText }; return result; } catch (Exception ex) { errorMessage = $"Ошибка в методе GetLogParsingResult: {ex.Message}"; return null; } } public LogParsingResult GetRemoteLogParsingResult(string contestName, string fileName, string remoteLogUri, bool loadToDb, out string errorMessage, string apiCode, string forwardedFor = null, string remoteAddr = null) { errorMessage = string.Empty; WriteLog("GetRemoteLogParsingResult", $"contestName = {contestName ?? "not defined"}, fileName = {fileName ?? "not defined"}, remoteLogUri = {remoteLogUri ?? "not defined"}, apiCode = {apiCode ?? "not deifined"}, remoteAddr = {remoteAddr ?? "not defined"}, forwardedFor = {forwardedFor ?? "not defined"}"); if (apiCode != ApiCode) return null; if (!ContestCollections.Contains(contestName)) return null; if (remoteLogUri == null) return null; try { var checkerObject = CheckerCollection.FirstOrDefault(x => x.Params.ParserParameters.ContestName == contestName); if (checkerObject == null) throw new ArgumentException($"{nameof(checkerObject)} == null", nameof(checkerObject)); var parameters = checkerObject.Params; var checker = checkerObject.Checker; ParsedLog parsedLog = null; string remoteLogContents; using (var wc = new UnSafeWebClient()) remoteLogContents = wc.DownloadString(remoteLogUri); var fileBytesArray = System.Text.Encoding.GetEncoding(1251).GetBytes(remoteLogContents); var isParsedSuccesfully = checker.ParseLog(fileName, fileBytesArray.Length, DateTime.Now, fileBytesArray, parameters, ref parsedLog, loadToDb); var result = new LogParsingResult { IsParsedSuccessfully = isParsedSuccesfully, Message = parsedLog.ParseResult.MessageRuHtml, MessageEn = parsedLog.ParseResult.MessageEnHtml, Callsign = parsedLog.Callsign, Category = parsedLog.Category, ClaimedResultsText = parsedLog.ClaimedResultsText }; return result; } catch (Exception ex) { errorMessage = $"Ошибка в методе GetRemoteLogParsingResult: {ex.Message}\n{ex.StackTrace}"; return null; } } public bool SendLog(string contestName, string subject, string body, string[] fileNames, byte[][] fileBytesArrays, out string errorMessage, string apiCode = null, string forwardedFor = null, string remoteAddr = null) { errorMessage = string.Empty; WriteLog("SendLog", $"contestName = {contestName ?? "not defined"}, subject = {subject ?? "not defined"}, body = {body ?? "not defined"}, remoteAddr = {remoteAddr ?? "not defined"}, forwardedFor = {forwardedFor ?? "not defined"}"); if (apiCode != ApiCode) return false; if (!ContestCollections.Contains(contestName)) return false; try { var checkerObject = CheckerCollection.FirstOrDefault(x => x.Params.ParserParameters.ContestName == contestName); if (checkerObject == null) throw new ArgumentException($"{nameof(checkerObject)} == null", nameof(checkerObject)); var checker = checkerObject.Checker; return checker.SendLog(subject, body, fileNames, fileBytesArrays, ref errorMessage); } catch (Exception ex) { errorMessage = $"Ошибка в методе SendLog: {ex.Message}"; return false; } } private IList<CheckerItem> CheckerCollection => StaticCheckers.Checkers; private IList<string> ContestCollections => CheckerCollection .Select(x => x.Params.ParserParameters.ContestName) .ToList(); private string GetClientIp() { OperationContext context = OperationContext.Current; MessageProperties prop = context.IncomingMessageProperties; RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; string ip = endpoint?.Address ?? "IP not known"; return ip; } private void WriteLog(string fileName, string text) { File.AppendAllText($"c:\\{fileName}.log", $"{DateTime.Now:dd.MM.yyyy HH:mm} IP = {GetClientIp()}: {text}\n"); } } public class CheckerItem { public int Id { get; set; } public string ConfigFilePath { get; set; } public clsChecker_Parameters Params { get; set; } public EmailChecker Checker { get; set; } } public static class StaticCheckers { public static IList<CheckerItem> Checkers { get; } static StaticCheckers() { Checkers = GetCheckerCollection(); } private static IList<CheckerItem> GetCheckerCollection() { var checkerCollection = new List<CheckerItem>(); var i = 0; foreach (var file in ConfigReader.GetCfgFiles()) { var fileInfo = new FileInfo(file); if (!fileInfo.Exists) continue; var iniReader = new ConfigReader(file); if (!iniReader.LoadConfig()) continue; var checker = new EmailChecker(iniReader.CheckerParameters); var item = new CheckerItem { Id = i, ConfigFilePath = file, Params = iniReader.CheckerParameters, Checker = checker }; checkerCollection.Add(item); i++; } return checkerCollection; } } }