using Common;
using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
using Masuit.MyBlogs.Core.Models.DTO;
using Masuit.MyBlogs.Core.Models.Entity;
using Masuit.MyBlogs.Core.Models.Enum;
using Masuit.Tools.Core.Net;
using Masuit.Tools.NoSQL;
using Masuit.Tools.Systems;
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace Masuit.MyBlogs.Core.Extensions.Hangfire
{
public class HangfireBackJob : IHangfireBackJob
{
private readonly IUserInfoService _userInfoService;
private readonly IPostService _postService;
private readonly ISystemSettingService _settingService;
private readonly ISearchDetailsService _searchDetailsService;
private readonly ILinksService _linksService;
private readonly RedisHelper _redisHelper;
private readonly IHttpClientFactory _httpClientFactory;
public HangfireBackJob(IUserInfoService userInfoService, IPostService postService, ISystemSettingService settingService, ISearchDetailsService searchDetailsService, ILinksService linksService, RedisHelper redisHelper, IHttpClientFactory httpClientFactory)
{
_userInfoService = userInfoService;
_postService = postService;
_settingService = settingService;
_searchDetailsService = searchDetailsService;
_linksService = linksService;
_redisHelper = redisHelper;
_httpClientFactory = httpClientFactory;
}
public void LoginRecord(UserInfoOutputDto userInfo, string ip, LoginType type)
{
var result = ip.GetPhysicsAddressInfo().Result;
if (result?.Status == 0)
{
string addr = result.AddressResult.FormattedAddress;
string prov = result.AddressResult.AddressComponent.Province;
LoginRecord record = new LoginRecord()
{
IP = ip,
LoginTime = DateTime.Now,
LoginType = type,
PhysicAddress = addr,
Province = prov
};
UserInfo u = _userInfoService.GetByUsername(userInfo.Username);
u.LoginRecord.Add(record);
_userInfoService.UpdateEntitySaved(u);
string content = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "template\\login.html").Replace("{{name}}", u.Username).Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Replace("{{ip}}", record.IP).Replace("{{address}}", record.PhysicAddress);
CommonHelper.SendMail(_settingService.GetFirstEntity(s => s.Name.Equals("Title")).Value + "账号登录通知", content, _settingService.GetFirstEntity(s => s.Name.Equals("ReceiveEmail")).Value);
}
}
public void PublishPost(Post p)
{
p.Status = Status.Pended;
p.PostDate = DateTime.Now;
p.ModifyDate = DateTime.Now;
Post post = _postService.GetById(p.Id);
if (post is null)
{
_postService.AddEntitySaved(post);
}
else
{
post.Status = Status.Pended;
post.PostDate = DateTime.Now;
post.ModifyDate = DateTime.Now;
_postService.UpdateEntitySaved(post);
}
}
public void RecordPostVisit(int pid)
{
Post post = _postService.GetById(pid);
var record = post.PostAccessRecord.FirstOrDefault(r => r.AccessTime == DateTime.Today);
if (record != null)
{
record.ClickCount += 1;
}
else
{
post.PostAccessRecord.Add(new PostAccessRecord
{
ClickCount = 1,
AccessTime = DateTime.Today
});
}
_postService.UpdateEntitySaved(post);
}
public static void InterceptLog(IpIntercepter s)
{
using (RedisHelper redisHelper = RedisHelper.GetInstance())
{
redisHelper.StringIncrement("interceptCount");
redisHelper.ListLeftPush("intercept", s);
}
}
///
/// 每天的任务
///
public void EverydayJob()
{
CommonHelper.IPErrorTimes.RemoveWhere(kv => kv.Value < 100); //将访客访问出错次数少于100的移开
_redisHelper.SetString("ArticleViewToken", SnowFlake.GetInstance().GetUniqueShortId(6)); //更新加密文章的密码
_redisHelper.StringIncrement("Interview:RunningDays");
DateTime time = DateTime.Now.AddMonths(-1);
_searchDetailsService.DeleteEntitySaved(s => s.SearchTime < time);
foreach (var p in _postService.GetAll().AsParallel())
{
try
{
p.AverageViewCount = p.PostAccessRecord.Average(r => r.ClickCount);
p.TotalViewCount = p.PostAccessRecord.Sum(r => r.ClickCount);
_postService.UpdateEntitySaved(p);
}
catch (Exception)
{
}
}
}
///
/// 检查友链
///
public void CheckLinks()
{
var links = _linksService.LoadEntities(l => !l.Except).AsParallel();
Parallel.ForEach(links, link =>
{
Uri uri = new Uri(link.Url);
HttpClient client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
client.DefaultRequestHeaders.Referrer = new Uri("https://masuit.com");
client.Timeout = TimeSpan.FromHours(10);
client.GetAsync(uri).ContinueWith(async t =>
{
if (t.IsCanceled || t.IsFaulted)
{
link.Status = Status.Unavailable;
return;
}
var res = await t;
if (res.IsSuccessStatusCode)
{
link.Status = !(await res.Content.ReadAsStringAsync()).Contains(CommonHelper.SystemSettings["Domain"]) ? Status.Unavailable : Status.Available;
}
else
{
link.Status = Status.Unavailable;
}
_linksService.UpdateEntity(link);
}).Wait();
});
_linksService.SaveChanges();
}
}
}